自C ++ 11起,存在专用的模板结构nullptr
和std::aligned_storage
关键字,用于存储任何选定类型的对齐数据。我想知道是否可以创建C ++ 03支持的alignas
的可移植替代品。我以为这是创建正确对齐的(std::aligned_storage
)unsigned
数组的唯一方法,但是对我来说,如何以正确的方式对齐它是一个未知数
答案 0 :(得分:3)
对于大多数类型,都可以在C ++ 03中实现alignof
,例如,关于this page的解释很长。
有了它,您可以使用一些模板专门化来使用具有该对齐方式的存储类型:
#include<iostream>
struct alignment {};
template<>
struct alignment<1> {
typedef char type;
static const unsigned div_v=sizeof(type);
static const unsigned add_v=div_v-1;
};
template<>
struct alignment<2> {
typedef short type;
static const unsigned div_v=sizeof(type);
static const unsigned add_v=div_v-1;
};
template<>
struct alignment<4> {
typedef int type;
static const unsigned div_v=sizeof(type);
static const unsigned add_v=div_v-1;
};
template<>
struct alignment<8> {
typedef double type;
static const unsigned div_v=sizeof(type);
static const unsigned add_v=div_v-1;
};
template<typename T>
struct align_store {
typedef alignment<__alignof(T)> ah;
typename ah::type data[(ah::add_v + sizeof(T))/ah::div_v];
};
int main() {
std::cout << __alignof(align_store<int>) << std::endl;
std::cout << __alignof(align_store<double>) << std::endl;
}