smalltalk - 如何对齐 Squeak FFI 中的结构字段

标签 smalltalk ffi squeak

如果我定义这样的结构 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/

相关文章:

smalltalk - Pharo:我可以手动而不是按字母顺序对协议(protocol)中的方法进行排序吗?

factory - Smalltalk 相当于工厂方法?

smalltalk - 是否可以在 Smalltalk 中将临时变量的声明设为可选?

rust - 如何从 Rust FFI 创建和返回 C++ 结构?

smalltalk - 追加两个字符串

smalltalk - Smalltalk中的图像间通信。可能的?

arrays - 在 Smalltalk 的数组中检测 x 次相同对象的序列的惯用方法?

c++ - 如何从 Rust 创建 C++ 对象?

rust - 无法使用 bindgen 设置包含路径