考虑以下结构:
struct Vector4D
{
union
{
double components[4];
struct { double x, y, z, t; } Endpoint;
};
};
在我看来,我在 WinApi 的 IPAddress 结构中看到了类似的东西。这个想法是让我可以通过索引和名称使用数组组件,例如:
Vector4D v;
v.components[2] = 3.0;
ASSERT(v.Endpoint.z == 3.0) //let's ignore precision issues for now
在 C++ 标准中,保证 POD 结构的开头没有“空白”空间,也就是说,元素 x 将位于 Endpoint 结构的开头。目前很好。但我似乎没有找到任何保证在 x
之间不会有空格或填充,如果你愿意的话。和 y
, 或 y
和 z
等等。虽然我还没有检查过 C99 标准。
问题是,如果 Endpoint 结构元素之间有空格,那么这个想法将行不通。
问题:
我说得对吗,确实不能保证这会在 C 或 C++ 中运行。
这是否适用于任何已知的实现?换句话说,您知道这不起作用的任何实现吗?
是否有任何标准(我的意思是不是特定于编译器的)方式来表达相同的想法?也许 C++0x 对齐功能可能有所帮助?
顺便说一句,这不是我在生产代码中做的事情,别担心,只是好奇。提前致谢。
最佳答案
- 是的
- 取决于架构和编译器策略的对齐需求
- 不,但是你可以制作一个对象包装器(但你最终会得到
.z()
而不仅仅是.z
)
大多数编译器应该支持使用 pragma 或属性压缩结构。 #pragma pack
例如。
关于c++ - 命名数组元素,或 union 内的结构和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6452384/