談談C++中的資料對齊
阿新 • • 發佈:2021-03-15
對於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;
};
#