我想知道静态分配的数组的对齐保证char
。查看其他 SO 问题,我发现了一些有关动态分配的char
.
对于静态分配char
的数组,它们是否对齐以便我可以将新的任何类型放入其中(只要它足够大)?还是这只适用于动态分配的?
char buff[sizeof(T)];
T * pT = (T*) buff;
new(pT) T(); // well defined?
...
pT->~T();
如果没有,我该如何克服这个问题?
我想知道静态分配的数组的对齐保证char
。查看其他 SO 问题,我发现了一些有关动态分配的char
.
对于静态分配char
的数组,它们是否对齐以便我可以将新的任何类型放入其中(只要它足够大)?还是这只适用于动态分配的?
char buff[sizeof(T)];
T * pT = (T*) buff;
new(pT) T(); // well defined?
...
pT->~T();
如果没有,我该如何克服这个问题?
在 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
它返回 type 的整数值std::size_t
。
如果要保证静态字符数组的对齐,可以使用联合技巧。
union
{
char buff[sizeof(T)];
uint64_t dummy;
};
这里将保证联合中最大元素的对齐。当然,你应该把这些讨厌的东西包在一个漂亮的课堂上。
编辑:更好的答案:
当然,使用C++11boost::aligned_storage
或alignas
使用 C++11 会更好。
不,静态分配的数组与字节对齐sizeof(element_type)
——对于 char 它是 1 个字节,这基本上保证了不对齐。