【发布时间】:2012-08-16 01:12:30
【问题描述】:
考虑以下结构:
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 struct 元素之间有空格,那么这个想法就行不通了。
问题:
我说得对吗,确实不能保证这在 C 或 C++ 中都能工作。
这实际上适用于任何已知的实现吗?换句话说,您知道有哪些实现方式不起作用吗?
是否有任何标准(我的意思不是特定于编译器)的方式来表达相同的想法?也许 C++0x 对齐功能可能会有所帮助?
顺便说一句,这不是我在生产代码中做的事情,别担心,只是好奇。提前致谢。
【问题讨论】:
-
这可能是相关的:stackoverflow.com/questions/6272768.
-
@Johannes:拥有引用的想法对我来说似乎很危险,因为引用将允许修改 const Vector4D 对象的组件...不是吗?
-
@Armed 是的。付出的代价。
.z()做事方式的一个很好的论据。
标签: c++ c c++11 unions memory-alignment