続き

どうも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用のコンパイラだとほぼ通るんでしょうけど。