【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

posted @ 2021-09-07 22:29  苏格拉底的落泪  阅读(378)  评论(0编辑  收藏  举报