我有一个结构,其相关部分是:
typedef struct {
uint64_t *num;
...
} name;
Run Code Online (Sandbox Code Playgroud)
在大多数架构中它自然会有对齐8,但由于原因(传统原因),我需要它有对齐4,因为我可以保证后者对齐,但不能保证前者.
我发现的解决方案是添加__attribute__((packed,aligned(4)))到声明中.
我已经在godbolt.com进行了测试,它确实可以工作,并在他们拥有的每个架构上产生正确数量的负载.
GCC文档没有特别提及这种组合,而clang文档根本没有提到这些属性.
我的问题是,这是多么便携(在类似unix的环境之间)和未来的证据?
明年的海湾合作委员会/铿锵会打破整个事情吗?
我应该更喜欢#pragma pack(4)它,看起来几乎相同吗?
是的,整个事情可能会在未来的任何版本中被破坏。编译器只需要实现 C 标准,并保留撤销您所依赖的此类细节的权利,特别是如果它们的实现在未来的体系结构中变得不可行。
这可能相当简单,但最好的选择是直面遗留问题。对我来说,这属于“在编写新代码之前总是修复错误”的类型。