c++ sizeof和alignof區別
阿新 • • 發佈:2021-09-08
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() { 1718 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; }