2012-01-20 9 views
0

リソース内のデータは、readを使用してfistreamから読み込まれ、readはchar配列を取ります。これをベクターに格納します。データへのcharポインタが必要ですが、例えば。私が頂点バッファのバウンディングボックスを計算する必要があるなら、私はフロートとしてデータを持っている必要があります。これを行うにはいい方法ですか?代わりにGetDataChar()のベクトルへの参照を返す必要がありますか?ファイルから読み取られたcharベクトルデータへのfloatポインタの返却

class Resource 
{ 
protected: 
    const std::vector<char>& GetDataRef() const 
    { 
     return m_data; 
    } 
private: 
    std::vector<char> m_data; 
} 

class VertexBuffer : public Resource 
{ 
public: 
    const char* GetDataChar() const 
    { 
     return &GetDataRef()[0]; 
    } 

    const float* GetDataFloat() const 
    { 
     return reinterpret_cast<float*>(&GetDataRef()[0]); 
    } 
} 

class IndexBuffer : public Resource 
{ 
public: 
    const char* GetDataChar() const 
    { 
     return &GetDataRef()[0]; 
    } 

    const int* GetDataInt() const 
    { 
     return reinterpret_cast<int*>(&GetDataRef()[0]); 
    } 
} 

答えて

1

C++標準は本当にこのことについては何も言っていない:外在オブジェクトも組み込み型の、およびそれらをリードバックが動作したり、動作しない場合があります。実際には、一般的には悪い考えです。物事をすばやく早くやり遂げることは、多くの場所で使用され(実際には「うまくいく」)、1つのプラットフォームへのアプローチの使用を効果的に制限します。私はあるEndianessを持つ32ビットワードに強い依存関係があるプロジェクト以上に取り組んできました。現代のシステムが64ビットの言葉と一般的な(したがって安価で強力な)CPUに異なるエンディアンを持つという事実は、これらのプロジェクトが32ビット互換モードで動作することを濫用した比較的高価なマシンに限定されていることを意味します。

つまり、標準的な注意が実際に保証されているにもかかわらず、実際に動作します。しかし、あなたが選択したアプローチは、ではなく、があまりにもうまくいくように拘束されています。charには実質的に位置合わせの制約がありません。つまり、std::vector<char>は、それ自身の娯楽のために他に何もないなら、それの前に32ビットの言葉。これは、ロードする単語が適切に位置合わせされておらず、ロードされないか、スローモーションでロードされることを意味します。つまり、あなたのstd::vector<T>オブジェクトが最大整列要件(たとえば、128ビットワードに対処するために16バイトのワード)を保持し、このタイプのアドレスをcharにキャストします。これはもちろん、データがマシンで使用されているのとまったく同じ形式でダンプされる必要があることを意味します。可能であれば、私はこのアプローチを避けようとします。

+0

Hmm ..私はあなたの答えを数回読んだことがありますが、私はそれを得ません:私は私が使用するデータを読むとき:m_data.resize(ファイルサイズ); filestream.read(&m_data [0]、fileSize);私は静かないくつかの場所でこれを行って見ました.. – bitgregor

+0

例としていくつかのコードを書くことができますか? – bitgregor

+0

短いバージョン:書式の異なるバイナリI/Oを別の方法で使用することはできません。フォーマットされていないバイナリI/Oが唯一のオプションである場合は、オブジェクトが正しく整列されていることを確認してください。 'std :: vector 'の 'char'の配列は正しく整列されないようにします。あなたが理解できないという言葉で話したら、私は強く**あなたには書式なしのバイナリI/Oを使わない**をお勧めします!あなたはこの答えがほしいとは思っていなかったかもしれないが、「それは働いている」と言っている可能性が非常に高いです。あなたが得られない部分を明らかにすれば、私は説明することができます。 –

関連する問題