読者です 読者をやめる 読者になる 読者になる

どこかのだれかへ

職業ゲームプログラマ。気になったニュースのピックアップや開発日記などを書いています。

alignによるアライメントの変化で思ってたsizeofと違う結果になった

事の発端

頂点データを設定したが、うまく描画されず調べてみるとVertex構造体のサイズが思ってたのと違う!

struct Vertex{
    Vector4 pos;
    Vector2 uv;
};

std::cout << sizeof(Vector4) << std::endl; // 16
std::cout << sizeof(Vector2) << std::endl; // 8
std::cout << sizeof(Vertex) << std::endl;  // 32

Vector4とVector2の合わせて24byteのつもりでデータを設定していたので頂点を1個進めるごとに8byteずれていってしまう。4byteアライメントと考えても24byteならなんの問題もないはず。一体なぜ。

原因

実は、Vector4はメンバ変数として__m128を使用しており、__m128は16byteアライン*1で定義されている。 どうやらこれによってVector4を持つクラス・構造体も16アライメントになるようで、結果24byteではなく、16の倍数である32byteになったようだ。

ちなみに、さらにこのVertex構造体をHogeクラスで持つと、やはりHogeクラスも16byteアライメントになった。

*1:メモリを16byte境界で確保する