今天學習了結構體這一章節,瞭解到了結構體在分配記憶體的時候採取的是對齊的方式 例如: 在這段程式中 輸出的並不是 15 //結構體集合內元素大小的簡單相加 而是 16 //此處就體現了在c語言結構體中記憶體開闢的原則 對齊原則 結構體對齊: 以最大的基本元素的大小(除數組)對齊,以本段程式為例: 1. ...
今天學習了結構體這一章節,瞭解到了結構體在分配記憶體的時候採取的是對齊的方式
例如:
1 #include<stdio.h> 2 struct test1 3 { 4 int a; 5 char b; 6 short c; 7 double d; 8 }; 9 int main() 10 { 11 printf("%d\n",sizeof(struct test1)); 12 13 return 0; 14 }
在這段程式中
輸出的並不是 15 //結構體集合內元素大小的簡單相加
而是 16 //此處就體現了在c語言結構體中記憶體開闢的原則 對齊原則
結構體對齊: 以最大的基本元素的大小(除數組)對齊,以本段程式為例:
1. 系統找到結構體內最大元素的大小(double的大小),並以此先開闢一個空間,此空間記憶體下double類型;
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
first
2.再開闢一個最大元素的大小空間,依次找第二大的元素,並存入double大小的空間內,5678記憶體下int類型;
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
second
3.餘下的四個空間內能存入short,12記憶體下short類型;
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
second
4.餘下的兩個空間內能存入char,4記憶體下char類型
2 | 3 | 4 | 5 | 6 | 7 | 8 |
second
至此結構體內元素全部存完,一共開闢了兩次也就是 16個位元組的大小 註:此處為什麼int要存在5678,以及char存在4,這兩個類型都不按順序存儲,有待研究。
為什麼當初c語言開發時結構體採取一個這樣的方式進行存儲?在查詢一些資料後,我總結有以下原因:
- 提高cpu運算速度,一次性能讀完一個元素。
- 平臺原因,也就是移植原因,不是所有的硬體平臺都能訪問任意地址的任意數據,某些硬體平臺只能在某些地址處取某些特定類型的數據的,否則就會硬體異常。
- 性能原因,數據結構(尤其是棧),應該儘可能在自然邊界上對齊,因為在訪問為對齊的記憶體時,處理器需要訪問兩次,而對齊的記憶體處理器只需要訪問一次。
2019-04-17 22:45:14 寢室隨筆