对齐保证静态字符数组

Tho*_*ing 4 c++ alignment

我想知道静态分配的数组的对齐保证char.看看其他SO问题,我发现了一些关于动态分配的数组char.

对于静态分配的char数组,它们是否对齐,以便我可以将任何类型放入其中(假设它足够大)?或者这仅适用于动态分配的?

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

如果没有,我该如何克服这个问题?

Naw*_*waz 9

在C++ 11中,正确的方法是:

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

注意使用alignas.

如果T是模板参数,那么使用std::alignment_of类模板更好:

char alignas(std::alignment_of<T>::value) buff[sizeof(T)]; 
Run Code Online (Sandbox Code Playgroud)

还要注意,参数alignas可以是正整数值或类型.所以这两个都是等价的:

char alignas(T)          buff[sizeof(T)];
char alignas(alignof(T))  buff[sizeof(T)]; //same as above
Run Code Online (Sandbox Code Playgroud)

第二个使用alignof它返回类型的整数值std::size_t.

  • **C+++**,这是多么好的语言!:P (3认同)

Ale*_*son 7

如果要保证静态char数组的对齐,可以使用union技巧.

union
{
    char buff[sizeof(T)];
    uint64_t dummy;
};
Run Code Online (Sandbox Code Playgroud)

这里将保证对齐中最大元素的对齐.当然,你应该把这种肮脏的东西包裹在一个很好的课堂上.

编辑:更好的答案:

当然,你更好的使用是boost::aligned_storage或alignas用于C++ 11.