C語言0417 結構體內存對齊

2021-09-19 03:29:35 字數 1497 閱讀 8289

知識點:

>結構體型別建立

>結構體初始化

>結構體內存對齊

>位段,位段計算機大小

>列舉+聯合

1.結構體的宣告

結構體的基礎知識:結構是一些值的集合,這些值成為成員變數。結構的每乙個成員可以是不同的變數。

例如描述乙個學生:

struct  str;
特殊的宣告:在宣告結構的時候,可以不完全宣告。

比如:

//匿名結構體型別

structx;//x表示變數

structa[20], *p;

結構體變數的定義和初始化:

struct pointp1; //宣告型別的同時定義變數p1

struct point p2; //定義結構體變數p2

//初始化:定義變數的同時賦初值。

struct point p3 = ;

struct stu;

struct stu s = ;//初始化

struct node

n1 = , null }; //結構體巢狀初始化

struct node n2 = , null }; //結構體巢狀初始化

結構體內存對齊:計算結構體的大小

首先的掌握結構體的對齊規則:

1. 第乙個成員在與結構體變數偏移量為0的位址處。

2. 其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。

對齊數= 編譯器預設的乙個對齊數 與 該成員大小的較小值。 vs中預設的值為8。

linux中的預設值為4。

3. 結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。

4. 如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數

(含巢狀結構體的對齊數)的整數倍。

記憶體對齊:

1. 平台原因(移植原因):不是所有的硬體平台都能訪問任意位址上的任意資料的;某些硬體平台只能在某些位址處取某些特定型別的資料,否則跑出硬體異常。

2.效能原因:資料結構(尤其是棧)應該盡可能地在自然邊界對齊。原因在於,為了訪問對齊的記憶體,處理器需要做兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。

總體來說:

結構體的記憶體對齊就是拿空間來換時間的做法。

//例如:

struct s1;

struct s2;

後續接著。bye~

染小熙要去喂貓啦~

C語言結構體內存對齊

1.效能原因 為了提高cup的效率訪問記憶體的速度,若是訪問未對齊的記憶體,處理器需要作兩次訪問 而訪問對齊的記憶體,則只需要一次訪問。2.編譯器相關 有的編譯器已經優化了記憶體對齊,所以記憶體對齊依賴於編譯器。參考 結構體對齊問題 說實話,規則看起來不太好理解,直接模仿下面步驟即可 以32位機器為...

C語言結構體內存對齊

記憶體中存放資料的時候要有一定的規則,這麼做得根本原因是要減少cpu訪問記憶體的次數。舉個例子,int型別為4個位元組,存放int型別的記憶體的起始位址就是4的倍數,這樣cpu訪問一次記憶體就能夠取到資料 跟cpu訪問記憶體的機制有關,加上cache的對映,一般cpu一次訪問64位元組的資料,也有1...

C語言 結構體內存對齊

1 平台原因 不是所有硬體平台都能夠訪問任意位址上的任意資料的,某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。2 效能原因 主要原因 資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問 而對齊的記憶體訪問僅需要一次訪問...