【C++编程】内存对齐之 alignof、alignas 、aligned_storage、align深度剖析
sizeof : 获取内存存储的大小。
alignof : 获取地址对其的大小,POD里面最大的内存对其的大小。
1 struct A{ //non-POD type 2 int avg; 3 int avg2; 4 double c; 5 A(int a,int b):avg((a+b)/2){ 6 7 } 8 }; 9 10 struct B{ 11 int avg; 12 int avg2; 13 char c; 14 }; 15 using namespace std; 16 int main() { 17 18 cout<<"sizeof(A):"<<sizeof(A)<<endl; 19 cout<<"alignof(A):"<< alignof(A)<<endl; 20 21 cout<<"sizeof(B):"<<sizeof(B)<<endl; 22 cout<<"alignof(B):"<< alignof(B)<<endl; 23 }
输出结果:
sizeof (A):16 alignof(A):8 sizeof (B):12 alignof(B):4
std::aligned_storage可以看成一个内存对其的缓冲区,原型如下:
template<std::size_t Len, std::size_t Align >= /default-alignment/>
Len表示所存储类型的sie, Align表示该类型的内存对齐大小
#include <iostream> using namespace std; struct A { //non-POD type int avg; int avg2; double c; A(int a, int b) : avg((a + b) / 2) {} }; int main() { typedef std::aligned_storage<sizeof(A), alignof(A)>::type A_pod; A_pod a, b; new (&a) A(10, 20); b = a; // cout<<b.avg<<endl;//错误 // cout<< reinterpret_cast<A>(b).avg<<endl;//错误 cout << reinterpret_cast<A &>(b).avg << endl; //正确 return 0; }
参考资料
1. 内存对齐之 alignof、alignas 、aligned_storage、align深度剖析https://zhuanlan.zhihu.com/p/417061548