5

コード行は千の言葉に値します:)これが私の問題です:

/* 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 をサポートするプラットフォームですべてのアサーションが渡されると期待できますか? ありがとうございました。

編集。部分的な回答。VS2008、GCC、ICC でいくつかのテストを行いました。MS コンパイラはptrptr2の両方を整列させましたが、GCC と ICC はptr2の整列に失敗しました。

4

2 に答える 2

4

C++ の新しい操作によるアドレス リターンのアラインメントの保証はありますか?

言い換えれば、標準を使用して、それが機能するはずであるという仮定を正当化することができますが、実際には、あなたの顔に爆発する可能性があります.

Visual C++ 6 では、doubles割り当てられたビアnewが適切に配置されませんでした。

于 2010-12-15T00:44:25.087 に答える
1

C++0x は新しい構造を提供します ( [meta.type.synop] 20.7.6.6 その他の変換内):

std::aligned_storage<Length, Alignment>

私が思い出す限り、これは常に正しく配置されることが保証されています。

2 番目のパラメーターはオプションであり、デフォルトで可能な限り最も厳しい要件が設定されます (厳密に指定しなくても常に安全ですが、試す気がある場合は型をよりコンパクトにパックできます)。

バグとは別に、コンパイラは要件を尊重する義務があります。C++0x を持っていない場合、これはtr1名前空間または にある可能性がありますBoost

特定のコンパイラがこの要求を尊重することをテストできるのはあなただけです:)

注: では、次gcc-4.3.2のように実装されます。

template<std::size_t _Len, std::size_t _Align = /**/>
struct aligned_storage
{
  union type
  {
    unsigned char __data[_Len];
    struct __attribute__((__aligned__((_Align)))) { } __align;
  };
};
于 2010-12-15T08:32:00.917 に答える