我想知道静态分配的数组的对齐保证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)
如果没有,我该如何克服这个问题?
在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.
如果要保证静态char数组的对齐,可以使用union技巧.
union
{
char buff[sizeof(T)];
uint64_t dummy;
};
Run Code Online (Sandbox Code Playgroud)
这里将保证对齐中最大元素的对齐.当然,你应该把这种肮脏的东西包裹在一个很好的课堂上.
编辑:更好的答案:
当然,你更好的使用是boost::aligned_storage或alignas用于C++ 11.
| 归档时间: |
|
| 查看次数: |
2193 次 |
| 最近记录: |