繁体   English   中英

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

[英]Naming Array Elements, or Struct And Array Within a Union

考虑以下结构:

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结构的beginnig中。 目前很好。 但是我似乎没有找到任何保证没有空的空间或填充,如果你愿意,在xy之间,或者yz等等。我还没有检查出C99标准。

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

问题:

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

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

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

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

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

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

只要在类中的引用之前声明数组以确保它们指向有效数据,就可以通过引用数组的每个元素来规避任何内存对齐问题。 话虽如此,我怀疑对齐是双打的问题,但可能是其他类型(浮在64位拱上?)

#include <iostream>
using namespace std;

struct Vector4D
{
    Vector4D() : components(), x(components[0]), y(components[1]), z(components[2]), t(components[3]) { }

    double components[4];

    double& x;
    double& y;
    double& z;
    double& t;
};

int main()
{
    Vector4D v;

    v.components[0] = 3.0;
    v.components[1] = 1.0;
    v.components[2] = 4.0;
    v.components[3] = 15.0;

    cout << v.x << endl;
    cout << v.y << endl;
    cout << v.z << endl;
    cout << v.t << endl;
}

希望这可以帮助。

说到标准,有两个问题:

  • 未指定在写入联合中的元素并从另一个元素中读取时会发生什么,请参阅C标准6.2.6.1和K.1
  • 该标准不保证struct的布局与数组布局的布局相匹配,详见C标准6.7.2.1.10。

说到这一点,实际上这将适用于普通的编译器。 事实上,这种代码广泛传播,通常用于将一种类型的值重新解释为另一种类型的值。

填充字节不会导致问题,因为所有变量都是double类型。 编译器将Vector4D视为double数组。 这意味着, v.Endpoint.zv[2]基本相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM