程式設計 C語言入門 結構體內存對齊

2021-10-25 09:01:02 字數 908 閱讀 9481

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

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

(對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值

(vs中預設的值為8)

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

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

總的來說,結構體的記憶體對齊是拿空間來換取時間的做法。

分析:

1、char c1:第乙個成員在與結構體變數偏移量為0的位址處。此時c1在結構體所開闢記憶體的0位址處。

2、char c2:第二個成員要對齊到某個數字(對齊數)的整數倍的位址處。char型別應該佔1個位元組,為了對齊,此時vs中預設的值為8,所以選擇1和8的較小值為1,此時1位址處恰好為1的整數倍,所以c2放在1位址處。

3、int i:第三個成員也要對齊到某個數字(對齊數)的整數倍的位址處。int型別應該佔4個位元組,為了對齊,此時vs中預設的值為8,所以選擇4和8的較小值為4,按道理應該放在2位址處,但2不是4的整數倍,所以c2放在4位址處,並且i佔4個位元組。

4、結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。此時此結構體正好占用8個位元組,上述三個成員的對齊數分別為1、1、4。8恰好為4的倍數,所以最終得到此結構體所佔記憶體為8。

C語言結構體內存對齊

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

C語言結構體內存對齊

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

C語言 結構體內存對齊

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