新手的學習之路 sizeof 的總結(1)

2021-07-10 22:25:23 字數 2347 閱讀 6205

以前對各種變數型別的儲存位元組總是模模糊糊,用到的時候才去網上查詢。這次自己準備也做個總結,期間vs上驗證用到sizeof,然後順便總結了struct和class的情況。

(1)基本變數

變數型別

32編譯器

64編譯器

int4

4short22

long44

long long88

float44

double88

char11

bool11

enum44

指標44

可以看出,在win下32位和64位編譯器基本變數儲存位元組的最大區別就是:指標

(2)陣列

當對陣列名使用sizeof時,其返回整個陣列的大小;但作為指標傳遞進函式後,只是作為乙個普通的指標,其大小為4,比如:

int a[3]=;

cout<

(3)struct

若結構體為空,其大小為1;

若不為空,結構體的儲存比較複雜,並不是簡單的位元組相加,比如:

struct student

;

按照我們一般的想法結構體的位元組數sizeof(student)=1+4+8=13,然而我們在**中驗證後就會發現sizeof(student)=16;這是為什麼呢?:原來是因為記憶體儲存的位元組對齊造成的。所謂的位元組對齊是為了加快計算機的處理速度,我們一般把資料型別都放在能夠被其位元組大小整除的位址上。比如對於結構體student,假設此結構體的儲存首位址pt能夠被1和4,8整除(char ,int和double 的儲存位元組數),其實事實上計算機也是這樣安排的,儲存過程如下:

name佔乙個位元組,直接儲存

id如果直接儲存,則id的儲存位址(pt+1)不會被4整除,因此我們為了使位元組對齊,就會在name後面填充3個位元組然後儲存id

score直接儲存的位址可以被8整除,所以我們不用填充位元組

總的位元組數sizeof(student)=4+4+8=16;

為了總結出一般的規律,我們使用偏移量這個概念:結構體成員儲存位址與結構體首位址的偏移位元組數。計算結構體大小時,請按照以下準則:

1.各成員變數的偏移量必須為該成員大小的整數倍,如不夠則在上乙個變數後填充位元組數

2.結構體的總大小必須為成員變數中最寬型別的整數倍,如不夠則在最後的變數後填充位元組數

例:

struct teacher

;

name

偏移量為0,直接儲存1個位元組(已占用1個位元組)

age

若直接儲存偏移量為1,不是2的倍數,所以在name後面填充1個位元組然後儲存(已占用4個位元組)

salary

若直接儲存偏移量為4,不是8的倍數,所以age後面填充4個位元組(已占用16個位元組)

id

若直接儲存

偏移量為16,是4的倍數,所以直接儲存

(已占用20個位元組)

20不是double(teacher結構體中最寬型別)位元組的整數倍,所以填充4個位元組使其成為整數倍。最後得出結構體的大小為24個位元組

(4)結構體中包含復合型別

struct a

;struct b

;

1.複合型變數的偏移量必須為  該變數中最寬資料型別大小 的整數倍;

2.先將複合型變數解散為基本變數,再尋找結構體中最寬的資料型別

上述例子中srtuct b:

v1

偏移量為0,是4的整數倍,直接儲存(已占用4個位元組)

v2 

若直接儲存偏移量為4,不是8(v2中最寬資料型別double位元組數)的整數倍,所以在v1後填充4個位元組數然後儲存(已占用24個位元組)

v3  

若直接儲存偏移量為24,是1的整數倍,直接儲存(已占用25個位元組)

25不是double(b中最寬型別)位元組的整數倍,所以填充7個位元組使其成為整數倍。最後得出結構體的大小為32個位元組

Linux的學習之路 新手文章

學習方法 安照命令功能進行分類學習記憶,熟練掌握常用命令和常用引數 pwd print working directory,列印當前工作目錄 cd change directory,改變當前工作目錄 mkdir make directory,建立資料夾 rmdir remove directory,...

分享 新手的測試之路

在51testing看到這篇文章,感覺豁然開朗,分享此篇文章,希望也能幫助到和我一樣的測試夥伴們 1 小a的個人背景 某大學 計算科學系 應屆畢業進入目前公司測試部門,入職9個月,一般測試人員。2 小a的主要工作內容 編寫測試用例 功能測試 手工 搭建測試環境。3 小a所在部門的組織結構 部門經理 ...

學習日記 小白新手起航之路

糾結問題 python聽了某機構入門課 機器學習數學基礎補充 主要是凸優化對偶問題 梯度等相關知識 看數學推導 看書,看b站的阿婆主的推導 總結輸出 畫思維導圖,或者寫筆記 統計學習方法 認真閱讀,數學搞懂。有付費帶讀 西瓜書 認真閱讀,數學搞懂。有付費的帶讀 python程式設計從入門到實踐 b站...