将3个整数的结构向量解释为数组

时间:2011-10-14 23:42:11

标签: c++ struct memory-layout

OpenGL具有BufferData(int array[])等功能,其中array的格式必须为x-y-z x-y-z ...

它只是一个整数序列,其中每个连续的3元组被解释为顶点。

将此表示为std :: vector是安全的,其中vertex声明为:

struct vertex
{
  int x, y, z;
};

在我看来,这会使语义更加清晰。但是,有可能保证这会起作用吗?

如果不是,还有其他方法可以提供更加语义的数据表示吗?

2 个答案:

答案 0 :(得分:2)

它可能有用,但它不可靠 - 结构成员之间可能有未命名的填充,因此您无法保证它们正确对齐

使用std :: vector有什么问题 - 标准保证这个内存正确对齐和顺序。

例如,您可以使用:

std::vector<int> cord(3,0);
BufferData(&cord[0]);

[编辑] Mooing Duck指出它需要超过1组3,所以在这种情况下只需要扩展向量

3个整数的3个元组

std::vector<int> cord(9,0);
BufferData(&cord[0]);

答案 1 :(得分:0)

结构存储器可以使用编译指令打包

#pragma pack(push,1)
struct vertex
{
int x,y,z;
};
#pragma pack(pop,1)

向量连续存储数据,可以使用以下简单程序验证:

#include <iostream>
#include <vector>

using namespace std;
#pragma pack(push,1)
struct vtx
{
    int x,y,z;
};
#pragma pack(pop,1)

main()
{
    vector<vtx> v(3);
    v[0].x=v[0].y=v[0].z=1;
    v[1].x=v[1].y=v[1].z=2;
    v[2].x=v[2].y=v[2].z=3;
    int *p=&v[0].x;
    for(int i=0;i<9;i++) cout<<*p++<<endl;
}

输出将是: 1 1 1 2 2 2 3 3 3

所以答案是肯定的。