如何通过`__attribute __((packed,aligned(N)))强制结构对齐?

时间:2017-10-02 13:14:53

标签: c gcc clang

我有一个结构,其相关部分是:

typedef struct {
    uint64_t *num;
    ...
} name;

在大多数架构中它自然会有对齐8,但由于原因(传统原因),我需要它有对齐4,因为我可以保证后者对齐,但不能保证前者。

我发现的解决方案是在声明中添加__attribute__((packed,aligned(4))) 我已经在godbolt.com上对它进行了测试,它确实可以正常工作并在每个架构上产生正确数量的负载。

GCC docs没有特别提及这种组合,而clang文档根本没有提到这些属性。

我的问题是,这是多么便携(在类似unix的环境之间)和未来的证据? 明年的海湾合作委员会/铿锵会打破整个事情吗?

我是否应该更喜欢#pragma pack(4),它看起来非常相同?

2 个答案:

答案 0 :(得分:2)

__attribute__(packed)用于gcc,其他一些像clang这样的编译器可能会理解它,但是像visual studio这样的其他编译器不会...... C编译器会使用abi的正常内容,请参阅:The Lost Art of C Structure Packing

你能做的最好的事情就是找到最佳的自然包装:

从大到小排序它们......你最终会得到自然包装的最小结构......

或者如果你只需要在linux上使用GCC,那么只需使用packed属性继续你的快乐方式,知道它无处不在。

答案 1 :(得分:1)

是的,在将来的任何版本中都可以打破整个事情。编译器只需要实现C标准,并保留撤销您所依赖的细节的权利,特别是如果它们的实现在未来的架构中变得不可行。

它可能相当简单,但你最好的选择是直接解决传统问题。对我来说,这就是“在编写新代码之前总是修复bug”类型。