在并集中命名数组元素或结构和数组
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结构的开头。到目前为止还不错。但我似乎找不到任何保证,即x
和y
之间,或者y
和z
之间不会有空格或填充,如果你愿意的话。不过,我还没有检查C99标准。
问题是,如果Endpoint结构元素之间有一个空格,那么这个想法就行不通了。
问题:
我说得对吗?确实不能保证这在C或C++中都有效。
这在任何已知的实施中都有效吗?换句话说,你知道有什么实现不起作用吗?
有没有任何标准的(我的意思不是编译器特定的)方式来表达同样的想法?也许C++0x对齐功能可能会有所帮助?
顺便说一句,这不是我在生产代码中所做的事情,别担心,只是好奇。提前谢谢。
- 是
- 取决于体系结构和编译器策略的一致性需求
- 不需要,但您可以制作一个对象包装器(但最终将使用
.z()
而不仅仅是.z
)
大多数编译器应该支持使用杂注或属性来压缩结构。例如CCD_ 7。
您可以通过引用数组的每个元素来避免任何内存对齐问题,只要您在类中的引用之前声明数组,以确保它们指向有效数据。话虽如此,我怀疑对齐是否会成为双打的问题,但也可能是其他类型的问题(可能是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
- 该标准不保证结构的布局与数组的布局相匹配,详见C标准6.7.2.1.10
话虽如此,在实践中,这将适用于普通编译器。事实上,这种代码被广泛传播,经常用于将一种类型的值重新解释为另一种类型。
填充字节不会导致问题,因为所有变量都属于double
类型。编译器将把Vector4D
当作double
数组处理。也就是说,v.Endpoint.z
与v[2]
本质上是相同的。
相关文章:
- C++将文本文件中的数据读取到结构数组中
- JSON转换为nlohmann JSON-lib中的结构数组
- 需要帮助将结构数组传递给函数
- 在 64 位边界上对齐C++结构数组?
- 带有枚举方向/类型的气泡排序结构数组
- 在C++中访问结构数组中的数据
- 从指向结构数组的指针中提取元素
- 如何制作一个地图,其中的值是C++中的结构数组
- 如何在函数中显示结构数组
- 包含作为成员C++函数的结构数组
- 如何修复函数中的 fstream 文件输入以将正确的信息存储在结构数组中?
- std::transform 将一个结构数组复制到另一个结构数组
- 将非托管结构数组封送到托管数组
- 显示结构数组
- 结构数组中所有类似字段的总和
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- 在 glsl opengl 中将嵌套结构数组作为统一传递
- 使用初始化列表填充C++中的多维结构数组时出现问题
- 如何将字符串字符与结构数组进行比较?
- C++结构数组