对齐保证静态字符数组

时间:2012-06-26 19:29:33

标签: c++ alignment

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

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

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

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

3 个答案:

答案 0 :(得分:9)

在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

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

答案 1 :(得分:7)

如果要保证静态字符数组的对齐,可以使用联合技巧。

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

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

编辑:更好的答案:

当然,对于C ++ 11,使用boost::aligned_storagealignas会更好。

答案 2 :(得分:1)

没有。静态分配的数组与sizeof(element_type)字节对齐 - 对于char,它是1个字节,这基本上保证不对齐。