Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用联合将相同内存分配给类成员变量_C++_Vector_Simd_Vectorization_Altivec - Fatal编程技术网

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();
}