C++ 使用联合将相同内存分配给类成员变量
我正在尝试对现有的向量类进行向量化C++ 使用联合将相同内存分配给类成员变量,c++,vector,simd,vectorization,altivec,C++,Vector,Simd,Vectorization,Altivec,我正在尝试对现有的向量类进行向量化 class Vector { public: float X,Y,Z; }; 尝试对类成员进行矢量化,而不影响访问这些成员变量的其他类 class Vector { public: union{ float X,Y,Z; vector float vec4; }; }; 但是有一个编译器错误,因为没有找到memeber名称X,Y,Z。是否有其他方法获取变量 作为参考,vector float类型来自 这是我认为
class Vector
{
public:
float X,Y,Z;
};
尝试对类成员进行矢量化,而不影响访问这些成员变量的其他类
class Vector
{
public:
union{
float X,Y,Z;
vector float vec4;
};
};
但是有一个编译器错误,因为没有找到memeber名称X,Y,Z。是否有其他方法获取变量
作为参考,vector float
类型来自
<>这是我认为你可以用标准C++得到的最接近的一个例子——这使得向量更大,并且需要你自己实现赋值操作符。 < P>在标准C++中使用联盟没有办法。你只能读你以前写的东西。因此,写入
X
,Y
,Z
然后读取vec4
会产生未定义的行为
我建议创建一个成员函数
vector float to vector()const
,它将在需要时创建向量。或者您可以考虑定义一个成员<代码>运算符向量浮点()/const .< /p> 您不能完全按照您的要求(使用代码中的语法)来完成。p>
一个正确的方法示例:
union{
float coords[4];
vector float vec4;
};
然后你可以一个元素一个元素地挑选
或者:
union{
struct {
float X, Y, Z;
} v;
vector float vec4;
};
但是,您可以通过
.v.X
访问值,这应该可以做到
#include <iostream>
using namespace std;
class Point
{
public:
Point() { X = 0.0f; Y = 0.0f; Z = 0.0f; };
~Point() {};
union
{
struct{
float X; float Y; float Z;
};
float index[3];
};
float operator[](int it)
{
return index[it];
};
};
void main()
{
Point p;
p.X = 1.0f;
p.Y = 2.0f;
p.Z = 3.0f;
cout << p[0] << " " << p[1] << " " << p[2] << endl;
p.index[0] = 4.0f;
p.index[1] = 5.0f;
p.index[2] = 6.0f;
cout << p[0] << " " << p[1] << " " << p[2] << endl;
cin.get();
}
#包括
使用名称空间std;
类点
{
公众:
点(){X=0.0f;Y=0.0f;Z=0.0f;};
~Point(){};
联盟
{
结构{
浮动X;浮动Y;浮动Z;
};
浮动指数[3];
};
浮点运算符[](int-it)
{
返回索引[it];
};
};
void main()
{
p点;
p、 X=1.0f;
p、 Y=2.0f;
p、 Z=3.0f;
难道这行代码看起来非常错误:vector float vec4;
。啊,我明白了。很抱歉。但也许你应该提到::)在一个声明器中声明三个float并不能神奇地使它们成为一个“实体”。这只是一个简写。你必须将它们包装在某种结构中。我认为是MSVC将匿名工会的成员作为扩展提升到父范围中的?@Erik:`vector float vec4;'不会真正编译!@Als:请看Rinesh的评论-他使用的是定义a.o类型的SIMD扩展vector float
,难道没有办法访问吗变量X,Y,Z和以前一样,并且有vec4指向同一个位置。@Erik:用你所拥有的&(u.X)=&(u.Y)=&(u.Y)=&(u.Z)
。你需要另一个结构级别。是的,它是UB,但它几乎得到了普遍的安全支持,UB经常被人们忽略……这通常是(非常正确的)的像躲避瘟疫一样躲避UB。你想怎么做就怎么做。
#include <iostream>
using namespace std;
class Point
{
public:
Point() { X = 0.0f; Y = 0.0f; Z = 0.0f; };
~Point() {};
union
{
struct{
float X; float Y; float Z;
};
float index[3];
};
float operator[](int it)
{
return index[it];
};
};
void main()
{
Point p;
p.X = 1.0f;
p.Y = 2.0f;
p.Z = 3.0f;
cout << p[0] << " " << p[1] << " " << p[2] << endl;
p.index[0] = 4.0f;
p.index[1] = 5.0f;
p.index[2] = 6.0f;
cout << p[0] << " " << p[1] << " " << p[2] << endl;
cin.get();
}