您好,登錄后才能下訂單哦!
這篇文章主要講解了“C語言結構體的內存對齊與大小怎么計算”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C語言結構體的內存對齊與大小怎么計算”吧!
struct S1 { char c1; // 1 byte,默認對齊數為8,所以c1的對齊數是1,第一個成員變量放在與結構體變量偏移量為0的地址處 int i; // 4 byte,默認對齊數為8,所以i的對齊數是4,所以i要放到偏移量為 4的整數倍 的地址處 char c2; // 1 byte,默認對齊數為8,所以c2的對齊數是1,所以c2要放到偏移量為 1的整數倍 的地址處 //最大對齊數是4 //成員大小為9,不是最大對齊數4的整數倍,所以結構體總大小為12 }; printf("%d\n", sizeof(struct S1));
原理分析:
【練習題】
// 練習1 struct S2 { char c1; // 1 byte / 8,對齊數是1, char c2; // 1 byte / 8,對齊數是1, int i; // 4 byte / 8,對齊數是4, // 最大對齊數是4 // 成員大小為8,是最大對齊數的整數倍,所以結構體總大小為8 }; printf("%d\n", sizeof(struct S2)); // 練習2 struct S3 { char c; // 1/8,對齊數是1 int i; // 4/8,對齊數是4 double d; // 8/8,對齊數是8 // 最大對齊數是8 // 成員大小為16,是最大對齊數的整數倍,所以結構體總大小為16 }; printf("%d\n", sizeof(struct S3)); // 練習3-結構體嵌套問題 struct S4 { char c1; // 1/8,對齊數是1 struct S3 s3; // 16 byte,【S3的最大對齊數是8】,所以s3要放到8的整數倍的地址處 double d; // 8/8,對齊數是8 // 最大對齊數是8 // 成員大小為32,是最大對齊數的整數倍,所以結構體總大小為32 }; printf("%d\n", sizeof(struct S4));
第一個成員變量在與結構體變量偏移量為 0 的地址處。
其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。
對齊數 =「編譯器默認的一個對齊數」與「該成員大小」中的較小值。
VS中默認對齊數為「8」,Linux中沒有對齊數
結構體總大小為:最大對齊數(每個成員變量都有一個對齊數)的整數倍。
如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍。
大部分的參考資料是這樣說的:
平臺原因(移植原因): 不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常。(那我們就要將數據對齊到能夠訪問的這些地址處)
性能原因:數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。 原因在于,為了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。
結構體的內存對齊是拿空間來換取時間的做法。
思考:那在設計結構體的時候,我們既要滿足對齊,又要節省空間,如何做到:
讓占用空間小的成員盡量集中在一起。
// 例如: struct S1 { char c1; // 1/8,對齊數是1 int i; // 4/8,對齊數是4 char c2; // 1/8,對齊數是1 // 最大對齊數是4 // 成員大小為9,不是最大對齊數的整數倍,所以結構體總大小為12 }; struct S2 { char c1; // 1/8,對齊數是1 char c2; // 1/8,對齊數是1 int i; // 4/8,對齊數是4 // 最大對齊數是4 // 成員大小為8,是最大對齊數的整數倍,所以結構體總大小為8 };
S1和S2類型的成員一模一樣,但是S1和S2所占空間的大小卻有了一些區別。
感謝各位的閱讀,以上就是“C語言結構體的內存對齊與大小怎么計算”的內容了,經過本文的學習后,相信大家對C語言結構體的內存對齊與大小怎么計算這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。