我有一个结构,其相关部分是:
typedef struct {
uint64_t *num;
...
} name;
在大多数架构中它自然会有对齐8,但由于原因(传统原因),我需要它有对齐4,因为我可以保证后者对齐,但不能保证前者。
我发现的解决方案是在声明中添加__attribute__((packed,aligned(4)))
我已经在godbolt.com上对它进行了测试,它确实可以正常工作并在每个架构上产生正确数量的负载。
GCC docs没有特别提及这种组合,而clang文档根本没有提到这些属性。
我的问题是,这是多么便携(在类似unix的环境之间)和未来的证据? 明年的海湾合作委员会/铿锵会打破整个事情吗?
我是否应该更喜欢#pragma pack(4)
,它看起来非常相同?
答案 0 :(得分:2)
__attribute__(packed)
用于gcc,其他一些像clang这样的编译器可能会理解它,但是像visual studio这样的其他编译器不会...... C编译器会使用abi的正常内容,请参阅:The Lost Art of C Structure Packing
你能做的最好的事情就是找到最佳的自然包装:
从大到小排序它们......你最终会得到自然包装的最小结构......
或者如果你只需要在linux上使用GCC,那么只需使用packed属性继续你的快乐方式,知道它无处不在。
答案 1 :(得分:1)
是的,在将来的任何版本中都可以打破整个事情。编译器只需要实现C标准,并保留撤销您所依赖的细节的权利,特别是如果它们的实现在未来的架构中变得不可行。
它可能相当简单,但你最好的选择是直接解决传统问题。对我来说,这就是“在编写新代码之前总是修复bug”类型。