人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統 > 硬件軟件教程 > 詳細頁面

用于計算結構尺寸的Sizeof規則

用于計算結構尺寸的Sizeof規則

更新時間:2023-06-20 文章作者:未知 信息來源:網絡 閱讀次數:

根據運行的環境,操作系統可以分為桌面操作系統,手機操作系統,服務器操作系統,嵌入式操作系統等。

數組大小 sizeof_大小結構_sizeof計算結構體大小

結構的大小

(前一部分可獲得,后一部分應嵌入

該結構的解釋不詳細,可以使用

供參考)

運算符sizeof可以計算給定類型的大小. 對于32位系統,

sizeof(char)= 1; sizeof(int)= 4.

基本數據類型的大小易于計算,讓我們看一下如何計算結構化數據類型的大小.

C語言中有三種類型的結構數據: 數組,結構和聯合.

數組是相同類型元素的集合. 只要計算出單個元素的大小,整個數組所占用的空間就等于基數

將基本元素的大小乘以元素數.

結構中的成員可以是不同的數據類型,并且成員按照定義的順序存儲在連續的內存中

空格. 與數組不同,結構的大小不僅僅是所有成員大小的總和. 需要考慮的是系統在

存儲結構變量時的地址對齊問題. 看一下這樣的結構:

struct stu1

{

int i;

字符c;

int j;

數組大小 sizeof_sizeof計算結構體大小_大小結構

};

首先介紹一個相關的概念偏移. 偏移量是指結構變量中成員的地址和結構更改

測量地址差. 結構的大小等于最后一個成員的偏移量加上最后一個成員的大小. 顯然sizeof計算結構體大小,結構

body變量中第一個成員的地址是結構變量的第一個地址. 因此,第一個成員i的偏移量為0.

第二個成員c的偏移量是第一個成員的偏移量加上第一個成員的大小(0 + 4),其值為4;第一個

三個成員j的偏移量是第二個成員的偏移量加上第二個成員的大小(4 + 1),其值為5.

實際上,由于存儲變量時地址對齊的要求,編譯器在編譯程序時將遵循兩個原則:

1. 成員在結構變量中的偏移量必須是成員大小的整數倍(0被視為任何數字的整數倍)

2. 結構的大小必須是所有成員大小的整數倍.

與第一個成員相比,上例中前兩個成員的偏移量滿足要求,但第三個成員的偏移量為

5,不是其自身大小(int)的整數倍. 處理時,編譯器將在第二個成員之后添加3個空字節,

使第三個成員的偏移量為8.

與第二個相比,該結構的大小等于最后一個成員的偏移量加上其大小,該大小在上例中計算得出

隨附的大小為12,符合要求.

看一下滿足第一項但不滿足第二項的情況

struct stu2

{

int k;

數組大小 sizeof_sizeof計算結構體大小_大小結構

短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.

如何計算結構中的成員是否為另一種結構類型?看下面的例子,

結構體溫度

大小結構_數組大小 sizeof_sizeof計算結構體大小

{

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個空字節

sizeof計算結構體大小_大小結構_數組大小 sizeof

成員,以使第三成員的偏移變為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


本文來自本站,轉載請注明本文網址:
http://www.pc-fly.com/a/jisuanjixue/article-287415-1.html



溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 静安区| 安吉县| 永嘉县| 临城县| 唐海县| 秦皇岛市| 五家渠市| 仁布县| 洪泽县| 故城县| 嘉兴市| 沾化县| 靖西县| 沾益县| 瑞安市| 沧州市| 夏津县| 太和县| 沅江市| 广安市| 定南县| 保山市| 鄂伦春自治旗| 信丰县| 金坛市| 芦山县| 泾阳县| 蓝田县| 长春市| 东港市| 广昌县| 东莞市| 香格里拉县| 玉田县| 台湾省| 山丹县| 铜梁县| 隆子县| 吉林市| 武定县| 翼城县|