请考虑以下类型:
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中对这些类型的对象应用哪些对齐规则?对齐可以改变,例如因为优化器会删除未使用的成员(特别是在联合中)?
答案 0 :(得分:1)
对象的对齐是实现定义的。如果要设置特定值,则应使用特定于编译器的属性。
编译器无法合理地确定某个成员是否未使用,因此不会删除" unused"来自工会或结构的成员(实际上,工会是另一回事,因为"未使用"意味着什么?)。
当编译器可以确定时,我能想到的唯一情况是,在结构的编译单元中只创建静态或自动变量时,这些变量永远不会传递给编译单元外部的函数和一个或多个成员从未用于陈述中。也许我忘记了一些违背这种推理的东西。
我认为在所有其他情况下,编译器无法确定是否未使用成员。例如,如果将其传递给另一个编译单元中的函数,则编译器无法更改定义,因为另一个函数将依赖于该定义,并且可能正在使用此编译单元中未使用的成员。
对于联合,编译器永远无法确定,因为成员的内存是共享的。