c++ - 命名数组元素,或 union 内的结构和数组

标签 c++ c c++11 unions memory-alignment

考虑以下结构:

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 , 或 yz等等。虽然我还没有检查过 C99 标准。

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

问题:

  1. 我说得对吗,确实不能保证这会在 C 或 C++ 中运行。

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

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

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

最佳答案

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

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

关于c++ - 命名数组元素,或 union 内的结构和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6452384/

相关文章:

c++ - 提取cpp中的所有包含文件

c++ - 空指针有什么用

c++ - GST_DEBUG : How to save logs in a separate file for a thread inside an application

c - 在 C 中迭代不断更新的目录

c++ - move 操作的条件编译

C++ 将任意函数从 DLL 动态加载到 std::function

c++ - 默认模板参数可以对应于特化吗?

c++ - 如何配置 VS2010 代码生成功能?

python - sqlite3_mutex_enter() 上的访问冲突。为什么?

c++ - 复制/移动分配困惑