我想知道静态分配的char
数组的对齐保证。看看其他SO问题,我发现了一些关于char
的动态分配数组。
对于静态分配的char
数组,它们是否对齐,以便我可以将任何类型放入其中(假设它足够大)?或者这只适用于动态分配的那些?
char buff[sizeof(T)];
T * pT = (T*) buff;
new(pT) T(); // well defined?
...
pT->~T();
如果没有,我该如何克服这个问题?
答案 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_storage
或alignas
会更好。
答案 2 :(得分:1)
没有。静态分配的数组与sizeof(element_type)
字节对齐 - 对于char,它是1个字节,这基本上保证不对齐。