【发布时间】:2014-11-22 06:56:57
【问题描述】:
struct {
uint64_t a; char z[120];
} b;
...
struct buffer_with_alignment_requirement* c = (struct buffer_w*)&b;
c->start_using_it;
如果没有第一个成员a,我们可能会在访问缓冲区中的字段时崩溃。简单地添加这样的成员来强制对齐整个结构足够严格是否可移植且正确?
这不是关于指针别名的问题,只是关于堆栈上b的地址是否总是八字节对齐。
【问题讨论】:
-
否 - 这取决于平台、编译器和编译器开关。
-
什么操作系统? posix_memalign 和 memalign 将在 Linux/UNIX 中为您强制对齐。
-
太不可思议了!如果可以的话,我会否决我自己的帖子。十分钟内 5 次投票赞成基本上是“让我在标准中为您搜索”的问题。我的最后一个问题(stackoverflow.com/questions/15294518)实际上很有趣并且被忽略了:(。
-
为什么不直接使用编译器编译指示来对齐?
-
@Mellowcandle 编译器编译指示通常是不可移植的,并且很少有编译器具有用于对齐的编译指示。 (例如,更常用的#pragma pack 并不能解决 OP 的问题)。
标签: c