使用联合为同类成员变量分配相同的内存

时间:2011-04-03 15:38:05

标签: c++ vector simd vectorization altivec

我正在尝试对现有的Vector类进行矢量化

class Vector
{
 public:
   float X,Y,Z;
};

尝试对类成员进行向量化,而不会影响访问这些成员变量的其他类

class Vector
{
 public:
   union{
      float X,Y,Z;
      vector float vec4;
   };
};

但是有一个编译器错误,因为找不到memeber名称X,Y,Z。有没有其他方法来获取变量?

作为参考,vector float类型来自IBM™ Cell Broadband Engine™ Software Development Kit V3.0 for Multicore Acceleration

4 个答案:

答案 0 :(得分:0)

struct VectorData {
  float X, Y, Z;
};

union VectorUnion {
  VectorData VecData;
  vector float vec4;
};


class Vector {
public:
  Vector() : X(u.VecData.X), Y(u.VecData.Y), Z(u.VecData.Z) {}
  float & X;
  float & Y;
  float & Z;
private:
  VectorUnion u;
};

这是我认为你能用标准C ++得到的最接近的 - 这会使Vector变大,并要求你自己实现赋值运算符。

答案 1 :(得分:0)

使用union在标准C ++中无法做到这一点。您可能只阅读您之前撰写的内容。因此,撰写XYZ然后阅读vec4会产生未定义的行为。

我建议创建一个成员函数vector float toVector() const,它将在需要时创建向量。或者您可以考虑定义成员operator vector float() const

答案 2 :(得分:0)

您不能完全按照自己的意愿行事(使用代码中的语法)。

一个示例正确的方法:

union{
    float coords[4];
    vector float vec4;
};

然后你可以逐个元素地选择。

可替换地:

union{
    struct {
        float X, Y, Z;
    } v;
    vector float vec4;
};

但是您可以通过.v.X

访问值

答案 3 :(得分:0)

这应该可以解决问题。

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