C ++ 03替代std :: aligned_storage

时间:2018-07-26 13:12:02

标签: c++ c++03

自C ++ 11起,存在专用的模板结构nullptrstd::aligned_storage关键字,用于存储任何选定类型的对齐数据。我想知道是否可以创建C ++ 03支持的alignas的可移植替代品。我以为这是创建正确对齐的(std::aligned_storageunsigned数组的唯一方法,但是对我来说,如何以正确的方式对齐它是一个未知数

1 个答案:

答案 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;
}