在联盟中命名数组元素或结构和数组

Arm*_*yan 10 c c++ memory-alignment unions c++11

考虑以下结构:

struct Vector4D
{
   union
   {
      double components[4];
      struct { double x, y, z, t; } Endpoint;
   };
};
Run Code Online (Sandbox Code Playgroud)

在我看来,我在WinApi的IPAddress结构中看到了类似的东西.我的想法是让我可以通过索引和名称来使用数组组件,例如:

Vector4D v;
v.components[2] = 3.0;
ASSERT(v.Endpoint.z == 3.0) //let's ignore precision issues for now
Run Code Online (Sandbox Code Playgroud)

在C++标准中,保证在POD结构的开头不会有"空"空间,也就是说,元素x将位于Endpoint结构的beginnig中.目前很好.但我似乎还没有找到任何保证将没有空的空间或填充,如果你愿意,之间xy,或yz,等等.我还没有检查出C99标准虽然.

问题是如果Endpoint结构元素之间有空格,那么这个想法就行不通了.

问题:

  1. 我是对的,确实无法保证这在C或C++中都能正常工作.

  2. 这实际上适用于任何已知的实现吗?换句话说,你知道任何不起作用的实现吗?

  3. 是否有任何标准(我的意思是不是编译器特定的)表达相同想法的方式?也许C++ 0x对齐功能可能会有所帮助?

顺便说一下,这不是我在生产代码中所做的事情,不用担心,只是好奇.提前致谢.

Let*_*_Be 5

  1. 取决于架构和编译器策略的对齐需求
  2. 不,但你可以制作一个对象包装器(但你最终会得到.z()而不仅仅是.z)

大多数编译器应该支持使用pragma或属性压缩结构.#pragma pack例如.