以前對各種變數型別的儲存位元組總是模模糊糊,用到的時候才去網上查詢。這次自己準備也做個總結,期間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站...