作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个结构,其相关部分是:
typedef struct {
uint64_t *num;
...
} name;
在大多数架构中它自然会对齐 8,但出于某些原因(遗留原因),我需要它具有对齐 4,因为我可以保证后者对齐,但不能保证前者对齐。
我找到的解决方案是将 __attribute__((packed,aligned(4)))
添加到声明中。
我已经在 godbolt.com 上对其进行了测试,它确实有效并在他们拥有的每个架构上产生了正确数量的负载。
GCC docs没有特别提到这个组合,而且 clang 文档根本没有提到这些属性。
我的问题是,它的可移植性(在类 unix 环境之间)和面向 future 的程度如何?
明年的 GCC/clang 能打破这一切吗?
我应该更喜欢 #pragma pack(4)
吗,它看起来非常相似?
最佳答案
__attribute__(packed)
用于 gcc,其他一些编译器(如 clang)可能理解它,但其他编译器(如 visual studio)不会...C 编译器将使用任何正常的 abi,请参阅:The Lost Art of C Structure Packing
真正你能做的最好的事情就是找到一个最佳的天然包装:
将它们从大到小排序......你最终会得到自然打包的最小结构......
或者如果您只需要在 Linux 上使用 GCC,那么只需使用 packed 属性并继续您的快乐方式,要知道它不会在任何地方都有效。
关于c - 强制结构与 `__attribute__((packed,aligned(N)))` 对齐是否具有前瞻性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46526226/
我是一名优秀的程序员,十分优秀!