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

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

于 2012-06-26T19:36:50.073 回答
7

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

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

这里将保证联合中最大元素的对齐。当然,你应该把这些讨厌的东西包在一个漂亮的课堂上。

编辑:更好的答案:

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

于 2012-06-26T19:34:09.273 回答
1

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

于 2012-06-26T19:31:07.193 回答