struct位元組計算

2021-07-22 04:24:59 字數 1656 閱讀 1557

若結構體為空,其大小為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個位元組。

結構體中包含復合型別

struct a  

; struct b

;

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

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

3.復合型別中,結構體裡面複雜型別位元組按整體儲存位元組計算,但最寬資料型別是在解散為基本變數的情況下去找。

上述例子中srtuct b:

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

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

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

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

struct 位元組對齊

轉貼 1.資料型別自身的對齊值 就是上面交代的基本資料型別的自身對齊值。2.指定對齊值 progma pack value 時的指定對齊值value。3.結構體或者類的自身對齊值 其成員中自身對齊值最大的那個值。4.資料成員 結構體和類的有效對齊值 自身對齊值和指定對齊值中小的那個值。有了這些值,我...

struct佔多少位元組例題

1 位元組對齊的細節和編譯器實現相關,但一般而言,如在windows下,就vc而言,滿足一下三個準則 1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組 interna...

struct與union位元組對齊問題

c 語言的一大優勢就是對記憶體空間的控制,當然,在物件導向語言的壓力下,程式設計師更喜歡輕鬆的語言,不喜歡自己還要顧慮記憶體空間。可是,c 語言仍然有很強的生命力,尤其是在作業系統 嵌入式系統這兩方面,因為要直接操作硬體,c語言就顯現出自己強大的體制 機制 邏輯優勢。c語言對記憶體控制,有乙個始終困...