【发布时间】:2016-09-05 18:17:16
【问题描述】:
请考虑以下类型:
typedef struct { char myArray[300]; } MyStruct;
typedef union { char myArray[300]; } MyUnion;
typedef struct { uint64_t x; } MyStruct2;
typedef union { uint64_t x; } MyUnion2;
typedef struct { uint64_t x; char myArray[300]; } MyStruct3;
typedef union { uint64_t x; char myArray[300]; } MyUnion3;
我可以找到有关复合类型成员的对齐和填充的信息,但我不确定这些类型本身的对象。
哪些对齐规则适用于在 X86 平台上使用 C90 和 C99 的 RAM 中这些类型的对象?对齐方式可以改变吗?因为优化器删除了未使用的成员(尤其是在联合中)?
【问题讨论】:
-
对象的对齐方式是实现定义的。如果要设置特定值,则应使用编译器特定属性或 _Alignas。
-
_Alignas 是可移植的,但不是 C99。
-
“C 和 C99”是什么意思?您是指“C11 和 C99”还是“C90 和 C99”或其他标准组合(或准标准 C)?但是对齐是实现定义的。
-
不允许编译器从联合体或结构体中删除未使用的成员。
-
编译器无法合理地确定成员未被使用,因此不会从联合或结构中删除“未使用”成员(实际上,联合是另一回事,因为“未使用”是什么意思?)。跨度>
标签: c struct c99 unions memory-alignment