c - C90 和 C99 中复合类型对象的对齐

标签 c struct c99 unions memory-alignment

请考虑以下类型:

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 中这些类型的对象适用哪些对齐规则?对齐方式可以改变吗?因为优化器会删除未使用的成员(特别是在 union 中)?

最佳答案

对象的对齐方式是由实现定义的。如果您想设置特定值,则应该使用编译器特定的属性。

编译器无法合理地确定某个成员未使用,因此不会从 union 或结构中删除“未使用”的成员(实际上, union 是另一回事,因为“未使用”意味着什么?)。

我能想到的编译器可以确定的唯一情况是,在结构体的编译单元中仅创建静态或自动变量,这些变量永远不会传递给编译单元外部的函数和一个或多个成员从未在语句中使用。也许我忘记了一些覆盖这个推理的东西。

我认为在所有其他情况下,编译器无法确定未使用成员。例如,如果将其传递给另一个编译单元中的函数,则编译器无法更改定义,因为另一个函数将依赖于该定义,并且可能使用此编译单元中未使用的成员。

对于 union ,编译器永远无法确定,因为成员的内存是共享的。

关于c - C90 和 C99 中复合类型对象的对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39335850/

相关文章:

c - 使用 mmap 添加到结构数组

c++ - 有没有办法恢复/恢复 nohup 以在控制台中查看输出?

java - 分析和检查由 Java 加载的 DLL 中的内存分配

c - 是否有任何 C 编译器会警告使用未声明的定义

c - 在内存中分配的修改后的结构在函数结束后不保留值

c - 使用 CMake 创建 VS 项目后的 rint() 问题

c - K&R 2-3 htoi 段错误

swift - 使用 Swift 在结构体中设置值

c++ - 如何在重载运算符中引用当前结构?

c - strtok() 在 C99 中返回错误值?