双方向情報発信で勉強になる

昨日のエントリでgintenlaboさんより指摘があり、アラインメントとパディングについてちょっと勉強しなおしてみました。ていうかよくよく考えてみたらマトモに勉強したことなかったですorz

詳しく解説しているサイトを見つけたので貼っておきます。
http://www5d.biglobe.ne.jp/~noocyte/Programming/Alignment.html

このサイトより引用。

誤解1:(32ビット CPU では) 構造体は常に4バイト境界に配置される.
     (別表現:構造体のサイズは常に4の倍数である.)

まさにこの誤解をしていましたorz

struct A{
	char a[3];
};

は4バイトだと思ってました。なのでこれをVectorに突っ込んでもパディングの分だけ余計なのが挟まり連続メモリにならないと思ってました。しかし実際にはcharしかメンバがないのでアラインメントは1バイトでパディングは発生しない。ていうか、要素が配列のみなので型が何であれメンバの型は一つしかないのでパディングは絶対発生しません。なのでstd::vector< std::array< T, N > >は必ず全ての要素が連続になります。

まあとにかく勉強になりました。gintenlaboさんには感謝です。