如果我定义这样的结构 struct foo {char x; float y;字符 z; double t};
对齐可以依赖于平台,但我希望在大多数架构/编译器上成员 x、y、z、t 的偏移量分别为 0、4、8、16。
如果我在Squeak中定义相应的结构
ExternalStructure subclass: #Foo
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'FFI-Tests'.
并简单地定义字段
Foo class>fields
^#(
(x 'char')
(y 'float')
(z 'char')
(t 'double') )
然后使用 Foo defineFields
生成访问器,我得到那些打包的偏移量:
Foo>>x
^handle unsignedCharAt: 1
Foo>>y
^handle floatAt: 2
Foo>>z
^handle unsignedCharAt: 6
Foo>>t
^handle doubleAt: 7
即字段偏移量分别为0,1,5,6。
我应该如何获得平台兼容对齐?
- 插入填充字段?
- 强制使用之前的字段大小?
- 忘记自动生成的东西并自己编写所有访问方法?
最佳答案
如果我强制将大小作为某些字段规范的第三个元素,那么我可以获得所需的偏移量。
Foo class>>fields
^#(
(x 'char' 4)
(y 'float' )
(z 'char' 8)
(t 'double')
)
我更喜欢一种方法来指定当前字段的对齐方式,而不是强制调整前一个字段的大小,但是好吧,也许有人会找到更好的解决方案。
请注意,它是以字节为单位的大小。如果我用 short 替换 char,那么如果我想获得相同的偏移量 0、4、8、16,我必须在第 3 列中保持相同的字节大小规范。
Foo class>>fields
^#(
(x 'short' 4)
(y 'float' )
(z 'short' 8)
(t 'double')
)
关于smalltalk - 如何对齐 Squeak FFI 中的结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49782651/