1. 程式人生 > >談談C++中的資料對齊

談談C++中的資料對齊

對於C/C++程式設計師來說,掌握資料對齊是很有必要的,因為只有瞭解了這個概念,才能知道編譯器在什麼時候會偷偷的塞入一些位元組(padding)到我們的結構體(struct/class),也唯有這樣我們才能更好的理解、優化結構體和記憶體。   ### 幾個栗子 看看幾個簡單的Struct,能猜出他們的SIZE嗎?(運行於64Bit win10 vs2017) ```cpp struct A { char c1; }; struct B { int i1; }; struct C { char c1; int i1; }; struct D { char c1; int i1; char c2; }; struct E { char c1; char c2; int i1; }; int main() { std::cout << "A's size is " << sizeof(A) << std::endl; std::cout << "B's size is " << sizeof(B) << std::endl; std::cout << "C's size is " << sizeof(C) << std::endl; std::cout << "D's size is " << sizeof(D) << std::endl; std::cout << "E's size is " << sizeof(E) << std::endl; } ``` 先揭曉答案 ![](https://img2020.cnblogs.com/blog/699616/202103/699616-20210314212322229-1513745051.png) 如果對任何一個結構體的大小有疑問,那麼這篇文章非常適合你,請接著往下看,我們會解釋資料對齊。   ### 資料對齊 #### 處理器讀取資料的行為 在C/C++中,每種資料型別都有對齊的要求(這個更多是處理器的要求而非語言層面),大家都知道,處理器工作的時候需要資料匯流排(data bus)、控制匯流排(control bus)和地址匯流排(address bus)一起配合工作。而在資料匯流排取資料的時候,處理器為了高效的工作,一次會取4byte或者8byte資料(依系統32bit或者64bit而不同),這就是所謂資料字長(word size)。同時在讀取記憶體的時候,也會從4byte或者8byte邊界開始讀取,這是處理器行為,我們只能尊重不能改變。考慮下面的例子, ```cpp struct F { int i1 char c1; int i2; char c2; }; #