目錄作者:佳佳要學習
時間:2022年9月25日
本章內容:結構體內存對齊
作者想說:如本文有錯誤之處,可以留言,感謝!10年積累的成都網站設計、成都網站建設經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站設計后付款的網站建設流程,更有漢陽免費網站建設讓你可以放心的選擇與我們合作。
定義了兩個結構體S1與S2,成員變量只有順序不一致。
當在計算兩個結構體的占內存大小的時候,會有什么區別呢?
struct S1
{char c1;
int i;
char c2;
};
struct S2
{char c1;
char c2;
int i;
};
int main()
{struct S1 s1;
printf("%d\n", sizeof(struct S1));
printf("%d\n", sizeof(struct S2));
return 0;
}
2. VS2019運行結果來,看一下!
S1 居然 比 S2 大了 4個字節!
那是為什么呢???
1.第一個成員在與結構體變量偏移量為0的地址處.
擴展:
offsetof:用來計算結構體成員相對于起始位置的偏移量。
2.其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。
對齊數 = 編譯器默認的一個對齊數 與 該成員大小的較小值。
解釋:
c1成員char類型占1個字節,偏移量為0。
i 成員int類型占4個字節,vs編輯器默認為8字節,選較小值:4
因為,在偏移量1處不是整數倍的地址處。
所以,一直往下找,找到偏移量4處,開始存放4個字節的i成員變量。
3.結構體總大小為大對齊數(每個成員變量都有一個對齊數)的整數倍。
c2最后占在了9偏移量處
結構體總大小為大對齊數:4
不滿足,第三條。
所以要繼續往下找,找到12偏移量處
得到該結構體占內存大小:12
4.如果嵌套了結構體的情況,嵌套的結構體對齊到自己的大對齊數的整數倍處,結構體的整
體大小就是所有大對齊數(含嵌套結構體的對齊數)的整數倍。
struct S3
{double d; //8
char c; //1
int i; //4
};
struct S4
{char c1; //1
struct S3 s3; //16
double d; //8
};
int main()
{printf("%d\n", sizeof(struct S4));
return 0;
}
三、存在此規則的原因c1 :占一個字節,偏移量:0
s3是一個結構體(共占16字節),結構體成員大是:8字節,
所以,我們需要從8開始,進行存放s3成員變量。
d是float類型,從24偏移量處開始,24是8的倍數。
從24開始存放d的變量,占8個字節
一共是32個字節
- 平臺原因(移植原因):
不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常。
- 性能原因:
數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。
原因在于,為了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。
結構體的內存對齊是拿空間來換取時間的做法。
那在設計結構體的時候,我們既要滿足對齊,又要節省空間,如何做到:讓占用空間小的成員盡量集中在一起。
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
標題名稱:c語言|結構體內存對齊-創新互聯
當前路徑:http://www.hntjjpw.com/article42/edphc.html
成都網站建設公司_創新互聯,為您提供做網站、Google、網站設計、品牌網站設計、用戶體驗、網站導航
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯