根據運行的環境,操作系統可以分為桌面操作系統,手機操作系統,服務器操作系統,嵌入式操作系統等。 結構的大小 (前一部分可獲得,后一部分應嵌入 該結構的解釋不詳細,可以使用 供參考) 運算符sizeof可以計算給定類型的大小. 對于32位系統, sizeof(char)= 1; sizeof(int)= 4. 基本數據類型的大小易于計算,讓我們看一下如何計算結構化數據類型的大小. C語言中有三種類型的結構數據: 數組,結構和聯合. 數組是相同類型元素的集合. 只要計算出單個元素的大小,整個數組所占用的空間就等于基數 將基本元素的大小乘以元素數. 結構中的成員可以是不同的數據類型,并且成員按照定義的順序存儲在連續的內存中 空格. 與數組不同,結構的大小不僅僅是所有成員大小的總和. 需要考慮的是系統在 存儲結構變量時的地址對齊問題. 看一下這樣的結構: struct stu1 { int i; 字符c; int j; }; 首先介紹一個相關的概念偏移. 偏移量是指結構變量中成員的地址和結構更改 測量地址差. 結構的大小等于最后一個成員的偏移量加上最后一個成員的大小. 顯然sizeof計算結構體大小,結構 body變量中第一個成員的地址是結構變量的第一個地址. 因此,第一個成員i的偏移量為0. 第二個成員c的偏移量是第一個成員的偏移量加上第一個成員的大小(0 + 4),其值為4;第一個 三個成員j的偏移量是第二個成員的偏移量加上第二個成員的大小(4 + 1),其值為5. 實際上,由于存儲變量時地址對齊的要求,編譯器在編譯程序時將遵循兩個原則: 1. 成員在結構變量中的偏移量必須是成員大小的整數倍(0被視為任何數字的整數倍) 2. 結構的大小必須是所有成員大小的整數倍. 與第一個成員相比,上例中前兩個成員的偏移量滿足要求,但第三個成員的偏移量為 5,不是其自身大小(int)的整數倍. 處理時,編譯器將在第二個成員之后添加3個空字節, 使第三個成員的偏移量為8. 與第二個相比,該結構的大小等于最后一個成員的偏移量加上其大小,該大小在上例中計算得出 隨附的大小為12,符合要求. 看一下滿足第一項但不滿足第二項的情況 struct stu2 { int k; 短t; }; 成員k的偏移量為0;成員t的偏移為4,因此不需要進行任何調整. 但是計算出的大小為6,顯示為 但是,它不是成員k大小的整數倍. 因此,編譯器將在成員t之后添加2個字節,以使結構更大 小的變成8,以滿足第二個要求. 可以看出,定義結構類型時需要考慮字節對齊,不同的順序會影響 結構的大小. 比較以下兩個定義序列 struct stu3 struct stu4 {{ char c1;字符c1; int i;字符c2; char c2; int i; }} 盡管結構stu3和stu4的成員相同,但是sizeof(struct stu3)的值為12,sizeof(structstu4)的值 的值 是8. 如何計算結構中的成員是否為另一種結構類型?看下面的例子, 結構體溫度 { char a [5]; 結構 { int w; 雙e; int h; } ss; double d; } tem; 只需擴展結構即可. 但是要注意的是,擴展結構的第一個成員(int w) 的偏移量 應該是要擴展的結構(ss所屬的結構)中最大成員(雙e)的整數倍. 解決方案如下: 第一個成員a [5]的偏移量為0. 第二個成員w的偏移量為第一個成員的偏移量加上第一個成員的偏移量 成員的大小(0 + 5),其值為5,不是(double e)大小的整數倍. 處理時,編譯器將排在第三位 在 之后添加3個空字節 成員,以使第三成員的偏移變為8. 第三成員e的偏移為第二 該成員的偏移量加上第二個成員的大小(8 + 4),該值為12. 第四個成員h的偏移量是第三個成員 成員的偏移量加上第三個成員的大小(12 + 8),值為20. 第五個成員d的偏移量是第一個成員 四個成員的偏移量加上第四個成員的大小(20 + 8),其值為28,而不是其自身大小(雙倍d) 的整數倍 . 處理時,編譯器將在第二個成員之后添加4個空字節,以便第三個成員的偏移量 成為32. 結構的大小等于最后一個成員的偏移量加上它的大小,在上面的示例中更大 小為40,符合要求. 此時,請注意,盡管char a [5]是5個字符的類型,但結構的大小是在末尾計算的. 計算1,即最終結構的大小可以被1整除,然后傳遞. (紫色部分是我自己的摘要). 請注意,在Linux下sizeof計算結構體大小,整個結構的大小應為: Char對齊模數為1,短為2,int為4,浮點數為4,兩倍(Linux為4,windows為8) 因此,對于以下結構: (32位計算機,默認設置) 結構體溫度 { int i; double j; }; 在WINDOWNS系統下,整個結構的大小應為16,在LINUX系統下,整個結構的大小 大小應為12
|
溫馨提示:喜歡本站的話,請收藏一下本站!