【发布时间】:2018-08-02 23:11:22
【问题描述】:
考虑以下联合:
typedef union {
struct { // Anonymous struct
int red;
int green;
int blue;
};
int colorChannels[3];
} Color;
不管这段代码在哪个系统上编译或执行,匿名结构中的字段是否总是与 colorChannels 中的索引对齐?
也就是说,规范是否要求myColor.colorChannels[0]的内存地址与myColor.red的地址相同?
另外,如果将代码编译为 C++ 而不是 C,答案会有所不同吗?
请注意,我询问的是联合中的每个元素都具有相同类型/大小的特定情况(即在这种情况下为 int)
【问题讨论】:
-
答案是“通常,但不是必须的”。您可能想要添加一个静态断言。请注意,在 C++ 中,像这样通过联合进行双关语是未定义的行为。
-
没有。而且很难理解为什么您会关心他们是否这样做,除非您将这种对齐方式用于一些非常不便携的转换滑稽动作。
-
注意:允许编译器在成员之间添加填充,例如支持有利于处理器寻址的对齐。
-
@EKW 这不是在 C++ 中实现这一点的方法。
-
那你为什么把它标记为C++?我刚刚删除了它。