2016-05-15 14 views
-1

私は今、可能な場合、そして最終的にどのようにしてクラスを特別な方法で実装して、そのクラスのベクトルを作成し、それを埋め込んだ後でクラスの属性はベクトルを反復することなくアトリビュートされます。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); 

私は今、弾丸物理学ライブラリがないことパフォーマンスの理由でこのようなものがあり、私は同じことをしたいと思いますが、どういうふうに理解できません。

+1

コードに若干の問題があります: 'float vec [3]'と構造体が同じサイズになるという保証はありません。システムのコンパイラのネイティブパディングが64ビットの場合、構造体は配列の2倍のサイズになります。 –

+2

あなたはおそらくC++の[POD types](http://en.cppreference.com/w/cpp/concept/PODType)と[memory alignment](http://stackoverflow.com/q/5435841/3344612) – teivaz

+0

それはまさに私が心配していたものです。 'float vec [3]'はクラスのメンバ関数やその他の属性も保持するので、私のクラスと同じサイズではありません – zeb

答えて

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

アウトはここに8.0として終わる必要があります。

+0

はい、私はこのようにすることができますが、' std: :vector 'for' fArr'は、要素を追加/削除するときにメモリ内を移動する 'std :: vector'のためにこれを使用できなくし、メッシュに頂点を追加/削除する可能性を保ちたいと思います。また、私は単純な 'vec3'を計算するのにちょっと必要があっても、常にfloat配列をサポートする必要があります – zeb

+0

vec.resize()を使ってベクトルにあらかじめメモリを割り当てると、問題を回避できますメモリを動かす。また、vec3コンストラクタをオーバーロードして、独自の配列を作成することもできます。 –

+0

はい、これは実現可能です。私はそれを試してみましょう – zeb

関連する問題