1. 程式人生 > 其它 >c++ sizeof和alignof區別

c++ sizeof和alignof區別

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