私は今、可能な場合、そして最終的にどのようにしてクラスを特別な方法で実装して、そのクラスのベクトルを作成し、それを埋め込んだ後でクラスの属性はベクトルを反復することなくアトリビュートされます。C++クラスのメモリレイアウト
これは一例です:
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);
私は今、弾丸物理学ライブラリがないことパフォーマンスの理由でこのようなものがあり、私は同じことをしたいと思いますが、どういうふうに理解できません。
コードに若干の問題があります: 'float vec [3]'と構造体が同じサイズになるという保証はありません。システムのコンパイラのネイティブパディングが64ビットの場合、構造体は配列の2倍のサイズになります。 –
あなたはおそらくC++の[POD types](http://en.cppreference.com/w/cpp/concept/PODType)と[memory alignment](http://stackoverflow.com/q/5435841/3344612) – teivaz
それはまさに私が心配していたものです。 'float vec [3]'はクラスのメンバ関数やその他の属性も保持するので、私のクラスと同じサイズではありません – zeb