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

123*_*eee 5 c gcc clang

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

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)它,看起来几乎相同吗?

Bat*_*eba 1

是的,整个事情可能会在未来的任何版本中被破坏。编译器只需要实现 C 标准,并保留撤销您所依赖的此类细节的权利,特别是如果它们的实现在未来的体系结构中变得不可行。

这可能相当简单,但最好的选择是直面遗留问题。对我来说,这属于“在编写新代码之前总是修复错误”的类型。