続き
どうもvector3_t、要するに3Dで使われるような座標のベクトルだった模様。
まぁIntel386系のコンパイラだとfloatは大体sizeof(float)==4なので3つ組だと12バイトなので16バイトアライメントにはなりませんなぁ。
#include <allocator.hpp> #include <vector> #include <iostream> struct vector3_t { float x; float y; float z; }; struct vector3_with_padding_t : public vector3_t { char padding[4]; }; int main() { std::vector<vector3_with_padding_t> v; vector3_t vec; for (int i = 0; i < 10; ++i) { vec.x = vec.y = vec.z = static_cast<float>(i); v.push_back(reinterpret_cast<vector3_with_padding_t&>(vec)); } for (std::vector<vector3_with_padding_t>::const_iterator itor = v.begin(); itor != v.end(); ++itor) std::cout << "coordinate: (" << itor->x << ", " << itor->y << ", " << itor->z << ")" << std::endl; return 0; };
のような感じでstd::vectorの上にはパディングつきで乗せといて何とかする、というような手法が使えなくもないことは無いですが・・・そもそも移植性とか規格準拠とか考えたら速攻捨てる手ですね。まぁCOMとかはこういうヤクザな手法ガシガシ使ってきてるのでwindows用のコンパイラだとほぼ通るんでしょうけど。