C ++类内存布局

时间:2016-05-15 16:17:37

标签: c++ memory-layout

我现在想,如果有可能,并且最终如何可能,以特殊的方式实现一个类,以便您可以创建该类的向量,并在填充它之后,迭代遍历类属性而不用迭代向量。

这是一个例子:

class Vertex3f
{
    public:
        union
        {
            float vec[3];
            struct
            {
                float x, y, z;
            };
        };

    public:
        Vertex3f();
        ~Vertex3f();

    ...
}

然后创建此类的std::vector,填充它并访问所有类的实例属性:

Vertex3f v1, v2;
v1.x = 10.0f;
v1.y = 0.0f;
v1.z = 5.0f;
v2.x = 8.0f;
v2.y = -5.0f;
v2.z = 3.0f;

// Create and fill the vector
std::vector<Vertex3f> vec;
vec.push_back(v1);
vec.push_back(v2);

// Get all the vertices data in one go
// This is the tricky part I'm not sure it can be done
size_t size = vec.size() * (sizeof(float) * 3);
float* vertices = new float[size];
memcpy(vertices, &vec[0].x, size);

我现在认为Bullet Physics库出于性能原因做了类似的事情,我想做同样的事情,但我不明白。

1 个答案:

答案 0 :(得分:0)

如果您只是想要这个功能,我可以使用另一个可能适合您的实现。

您可以创建浮点数组,然后为vec3类指定一个指向该向量中相应点的x位置的指针。

类似的东西:

class vec3
{
public:
    vec3(float* valN)
    {
        val = valN;
    }

    float x()
    {
        return *val;
    }
private:
    float* val;
};

int size = 3;
float* fArr = (float*)malloc(sizeof(float)*size);

fArr[0] = 8;
fArr[1] = 9;
fArr[2] = 10;

std::vector<vec3> points;
vec3 p(&fArr[0]);

points.push_back(p);

float out = points[0].x();

out应该在这里结束为8.0。