作業系統的記憶體對齊問題對於低層程式設計來說非常重要,對理解記憶體對齊原理及方法則有助於幫助程式設計師判斷訪問非法記憶體。
struct記憶體預設的記憶體對齊原則主要有兩個,乙個是結構成員之間的記憶體對齊,另乙個是結構體整體的記憶體對齊。
c編譯器預設的結構成員變數記憶體對齊為
「n位元組對齊」,
n即該成員資料型別的長度。例如,
int型成員變數的自然對界條件為
4位元組對齊,即該成員變數的起始偏移能夠被
4整除,如果不能被
4整除,則在前乙個成員變數後面新增適當的空位元組,最終使得
int型成員變數的起始偏移能夠被
4整除。
c編譯器預設的結構整體的記憶體對齊條件為:結構所佔記憶體大小要能夠被結構中成員變數中最大長度整除。例如結構
test
所佔的記憶體大小必須能夠被
sizeof(double)=8
所整除
struct test
char ch1;
int i1;
double d1;
如果不能被整除,則在最後乙個成員變數後面新增適當的空位元組,最終使得test結構所佔的記憶體能夠被
8整除。
可以根據如圖1所示的流程,對預設對齊方式下結構體的大小進行計算。
對於如下定義的結構體test
struct test
;其在記憶體中所佔的大小為24位元組。
可以使用預編譯指令#pragma pack(n)改變記憶體的對齊方式,其中
n的取值為
1,2,4,8,16,c
編譯器將按照
n個位元組對齊。
當使用預編譯指令改變了記憶體的對齊方式後,其對齊原則也會做相應的改變。對比「1.1
成員之間的對齊原則」中介紹的原則,此時
成員變數的起始偏移
不是能夠被該變數的長度所整除,而是能夠被該變數長度與n的最小值所整除。同理,對比「
1.2
結構體整體的對齊原則」中介紹的原則,
結構所佔記憶體大小不是能夠被結構中成員變數中最大長度整除,而是能夠被成員變數中最大長度
與n的最小值所整除。
在修改了記憶體的對齊方式之後,判斷結構大小的流程圖如圖2所示。對於如下定義的結構體
test
#pragma pack(4)
struct test
;其在記憶體中所佔的大小為16。
圖1 預設對齊方式,計算結構體大小的流程
C語言之struct結構體內存分配
實驗使用sizeof關鍵字測量結構體大小的規則 查資料得到的規則如下 原則1 資料成員對齊規則 結構 struct或聯合union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在32位機為4位元組,則要從4的整數倍位址開始...
結構體struct 的記憶體對齊問題(c語言)
對齊原因 1 為了避免移植後計算機讀取資料出錯 各個硬體平台對儲存空間的處理上有很大的不同,某些硬體平台只能在某些位址處去某些特定型別的資料,否則會出錯 2 為了提高計算機取數的效率 比如有些平台每次讀都是從偶位址開始,如果乙個int型 32位系統 如果放在偶數字址開始的地方,那麼一乙個讀週期就可以...
c語言之結構 struct
struct 結構就是建立乙個模板,類似於陣列,不過它可以擁有不同型別的變數,包括陣列 1,建立結構宣告 舉例 struct book char title 20 char author 20 float value 其中struct是關鍵字,book是結構名,裡面的titlt,author,val...