C語言結構體內存對齊詳解

2022-09-20 09:03:11 字數 1021 閱讀 7418

目錄

1、結構體內存對齊是指當我們建立乙個結構體變數時,會向記憶體申請所需的空間,用來儲存結構體成員的內容。我們可以將其理解為結構體成員會按照特定的規則來儲存資料內容。

2、結構體的對齊規則

(1)第乙個成員在相比於結構體變數儲存起始位置偏移量為0的位址處。

(2)從第二個成員開始,在其自身對齊數的整數倍開始儲存(對齊數=編譯器預設對齊數和成員位元組大小的最小值,vs編譯器預設對齊數為8)。

(3)結構體變數所用總空間大小是成員中最大對齊數的整數倍。

(4)當遇到巢狀結構體的情況,巢狀結構體對齊到其自身成員最大對齊數的整數倍,結構體的大小為當下成員最大對齊數的整數倍。

3、了解了結構體的對齊規則後,我們通過實戰來鞏固(例項一至例項三同類,請細品例項四)

紅色填充記憶體為結構體成員a,因其為char型別且是第乙個成員,由規則(1)可得如下;橙色填充為結構體成員b,因其為int型別且不是第乙個成員,由規則(2)可得如下;綠色填充為結構體成員c,因其為char型別且不是第乙個成員,由規則(2)(3)可得如下;畫紅叉記憶體位置屬於因對齊造成的浪費記憶體。

紅色填充記憶體為結構體成員a,因其為char型別且是第乙個成員,由規則(1)可得如下;橙色填充為結構體成員b,因其為char型別且不是第乙個成員,由規則(2)可得如下;綠色填充為結構體成員c,因其為int型別且不是第乙個成員,由規則(2)(3)可得如下;畫紅叉記憶體位置屬於因對齊造成的浪費記憶體。

紅色填充記憶體為結構體成員a,因其為double型別且是第乙個成員,由規則(1)可得如下;橙色填充為結構體成員b,因其為char型別且不是第乙個成員,由規則(2)可得如下;綠色填充為結構體成員c,因其為int型別且不是第乙個成員,由規則(2)(3)可得如下;畫紅叉記憶體位置屬於因對齊造成的浪費記憶體。

紅色填充記憶體為結構體成員a,因其為doubuheebwngcdle型別且是第乙個成員,由規則(1)可得如下;橙色填充為結構體成員s3,因其為巢狀結構體且不是第乙個成員,大小為16,由規則(4)可得如下圖;綠色填充為結構體成員c,因其為int型別且不是第乙個成員,由規則(2)(3)可得如下;畫紅叉記憶體位置屬於因對齊造成的浪費記憶體。

C語言結構體內存對齊

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

C語言結構體內存對齊

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

C語言 結構體內存對齊

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