如何解决命名数组元素或联合中的结构和数组
|| 考虑以下结构: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中。目前很好。但是我似乎找不到任何保证,如果有的话,在x
和y
之间或y
和z
之间将没有空白或填充。我还没有签出C99标准。
问题是,如果端点结构元素之间没有空格,那么该想法将行不通。
问题:
我说对了,实际上并不能保证它可以在C或C ++中运行。
这实际上可以用于任何已知的实现吗?换句话说,您知道在其中不起作用的任何实现吗?
是否有任何标准(我的意思不是特定于编译器的方式)表达相同的想法?也许C ++ 0x对齐功能可能有所帮助?
顺便说一句,这不是我在生产代码中正在做的事情,不用担心,只是好奇。提前致谢。
解决方法
是
取决于架构的对齐需求和编译器策略
不,但是您可以做一个对象包装器(但最终会得到
.z()
,而不仅仅是just7ѭ)
大多数编译器应支持使用编译指示或属性压缩结构。例如8ѭ。
, 您可以通过引用数组的每个元素来避免任何内存对齐问题,只要您在类中的引用之前声明该数组以确保它们指向有效数据即可。话虽如此,我怀疑对齐是否会成为双精度问题,但可能适用于其他类型(也许浮在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。
话虽如此,实际上这将适用于普通编译器。实际上,这种代码已经广泛传播,并且经常用于将一种类型的值重新解释为另一种类型的值。
, 填充字节不会引起问题,因为所有变量的类型均为“ 10”。编译器会将“ 11”视为“ 10”数组。也就是说,v.Endpoint.z
与v[2]
基本相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。