C90 和 C99 中复合类型对象的对齐
Alignment of compound type objects in C90 and C99
请考虑以下类型:
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 中这些类型的对象适用什么对齐规则?对齐方式可以改变吗?因为优化器删除了未使用的成员(尤其是在联合中)?
对象的对齐是实现定义的。如果你想设置一个特定的值,你应该使用编译器特定的属性。
编译器无法合理地确定某个成员未被使用,因此不会从联合或结构中删除 "unused" 成员(实际上,联合是另一回事,因为 "unused" 是什么意思?)。
我能想到的唯一一种编译器可以确定的情况是,在结构的编译单元中只创建静态或自动变量,这些变量永远不会传递给编译单元之外的函数,并且一个或more 成员从不在语句中使用。可能我忘记了一些推翻这个推理的东西。
我认为在所有其他情况下,编译器无法确定未使用成员。例如,如果它被传递给另一个编译单元中的函数,编译器无法更改定义,因为另一个函数将依赖于该定义,并且可能使用该编译单元中未使用的成员。
对于联合,编译器永远无法确定,因为成员的内存是共享的。
请考虑以下类型:
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 中这些类型的对象适用什么对齐规则?对齐方式可以改变吗?因为优化器删除了未使用的成员(尤其是在联合中)?
对象的对齐是实现定义的。如果你想设置一个特定的值,你应该使用编译器特定的属性。
编译器无法合理地确定某个成员未被使用,因此不会从联合或结构中删除 "unused" 成员(实际上,联合是另一回事,因为 "unused" 是什么意思?)。
我能想到的唯一一种编译器可以确定的情况是,在结构的编译单元中只创建静态或自动变量,这些变量永远不会传递给编译单元之外的函数,并且一个或more 成员从不在语句中使用。可能我忘记了一些推翻这个推理的东西。
我认为在所有其他情况下,编译器无法确定未使用成员。例如,如果它被传递给另一个编译单元中的函数,编译器无法更改定义,因为另一个函数将依赖于该定义,并且可能使用该编译单元中未使用的成员。
对于联合,编译器永远无法确定,因为成员的内存是共享的。