コードの行はここ:)千個の言葉の価値がある、私の問題は、次のとおりです。C++メモリアライメント質問
/* Platform specific 16-byte alignment macro switch.
On Visual C++ it would substitute __declspec(align(16)).
On GCC it substitutes __attribute__((aligned (16))).
*/
#define ALIGN_16 ...
struct ALIGN_16 A {...};
A* ptr = new A;
A* ptr2 = new A[20];
assert(size_t(ptr) % 16 == 0);
for (int i=0; i<20; ++i)
assert(size_t(ptr2+i) % 16 == 0);
assert(sizeof(A) % 16 == 0);
は、私はすべてのアサーションがSSEをサポートしているプラットフォーム上で合格することを期待することはできますか?ありがとうございました。
EDIT。部分的な答え。私はVS2008、GCCとICCでいくつかのテストをしました。 MSコンパイラは、ptrとptr2の両方を整列させましたが、GCCとICCは、アライメントに失敗しました。ptr2。
なぜ20の配列:
gcc-4.3.2
に、それは次のように実装されていますとして? – Johnちょうど私の頭の外。アレイのすべての要素が整列していれば、私はさまよっていました。 – watson1180
適切に割り当てられた配列の要素は、問題の型に対して適切に整列されるように標準によって保証されています。しかし、その整列は実装の詳細であり、理論的には1バイト(つまり、パックされた整列)になる可能性があります。 –