v
適切に配置されていない場合、明らかに間違っている可能性があります。
ただし、 によって動的に割り当てられるvector
ため、スタックのミスアライメントの問題は発生しません。
ただし、phoojiが正しく指摘しているように、「テンプレート」または「プロトタイプ」の値がstd::vector
コンストラクターに渡され、ベクターのすべての要素にコピーされます。std::vector::vector
スタックに配置されるのはこのパラメータであり、ずれている可能性があります。
一部のコンパイラには、関数内のスタック アラインメントを制御するためのプラグマがあります (基本的に、コンパイラは、すべてのローカルを適切にアラインするために、必要に応じて余分なスペースを浪費します)。
Microsoft のドキュメントによると、Visual C++ 2010 は SSE タイプに対して 8 バイトのスタック アラインメントを自動的に設定する必要があり、Visual C++ 2003 以降はそうしています。
gccについてはわかりません。
C++0x では、new point()
アラインされていないストレージを返すことは重大な違反です。 [basic.stc.dynamic.allocation]
言います(ドラフトn3225からの文言):
割り振り機能は、要求された量のストレージを割り振ろうとします。成功した場合は、バイト単位の長さが要求されたサイズと少なくとも同じ大きさのストレージのブロックの開始アドレスを返す必要があります。割り当て関数から戻ったときに、割り当てられたストレージの内容に制約はありません。連続する割り当て関数の呼び出しによって割り当てられるストレージの順序、連続性、および初期値は規定されていません。返されるポインタは、基本的なアラインメント要件 (3.11) を持つ完全なオブジェクト型のポインタに変換できるように適切にアラインされ、割り当てられたストレージ内のオブジェクトまたは配列にアクセスするために使用されます (ストレージが明示的に割り当て解除されるまで)。対応する割り当て解除関数への呼び出し)。
そして、次の[basic.align]
ように述べています。
さらに、要求されたアラインメントを受け入れることができない動的ストレージの実行時割り当ての要求は、割り当ての失敗として扱われます。
これが修正される可能性のある gcc の新しいバージョンを試してみてください。