5

の静的に割り当てられた配列のアラインメント保証を知りたいですchar。他の SO の質問を見て、動的に割り当てられた の配列に関するいくつかを見つけましcharた。

静的に割り当てられたchar配列の場合、新しい任意の型を配置できるように配置されていますか (十分に大きい場合)。それとも、これは動的に割り当てられたものにのみ適用されますか?

char buff[sizeof(T)];
T * pT = (T*) buff;
new(pT) T(); // well defined?
...
pT->~T();

そうでない場合、どうすればこの問題を克服できますか?

4

3 に答える 3

10

C++11 では、これを行う適切な方法は次のとおりです。

char alignas(T) buff[sizeof(T)]; //Notice 'alignas' as
T * pT = (T*) buff;
new(pT) T(); // well defined!

の使用に注意してくださいalignas

Tがテンプレート引数の場合、std::alignment_ofクラス テンプレートを次のように使用することをお勧めします。

char alignas(std::alignment_of<T>::value) buff[sizeof(T)]; 

への引数は、正の整数値またはalignasである可能性があることにも注意してください。したがって、これらはどちらも同等です。

char alignas(T)          buff[sizeof(T)];
char alignas(alignof(T))  buff[sizeof(T)]; //same as above

2 つ目はalignof、 type の整数値を返す whichを使用しますstd::size_t

于 2012-06-26T19:36:50.073 に答える
7

静的char配列の整列を保証したい場合は、ユニオントリックを使用できます。

union
{
    char buff[sizeof(T)];
    uint64_t dummy;
};

ここでは、ユニオン内の最大の要素の位置合わせが保証されます。そしてもちろん、あなたはこの厄介さを素敵なクラスで包むべきです。

編集:より良い答え:

もちろん、C++11を使用しboost::aligned_storageたり使用したりする方がよいでしょう。alignas

于 2012-06-26T19:34:09.273 に答える
1

いいえ。静的に割り当てられた配列はsizeof(element_type)バイト単位で整列されます。char の場合は 1 バイトであり、基本的に整列は保証されません。

于 2012-06-26T19:31:07.193 に答える