先記住常用型別在32和64位的位元組
型別32位
64位char11
int4
4short22
float44
double88
指標48
只有指標在64位時不同,是8。函式指標的typedef宣告不參與計算。列舉型別佔記憶體4位元組。
直接看幾個例子:
typedef
struct bb
;
我們以為它在記憶體中是這樣的:iiii wwwwwwww hhhh
其實是這樣的:iiii ---- wwwwwwww hhhh ----
最大的double佔8個,從左向右,每8個為一組,編譯器無法把iiii wwww
一起處理,那樣就把double截斷了,所以給int補4位。同理float補4位。總共24.
struct s1;
原本是這樣:c iiii ff vvvvvvvv
,從左向右按8補齊,應當是:c--- iiii ff------ vvvvvvvv
。c和i總共5,給c補3位就行。f沒法和v組合,只能補6位,總共24.
struct s1;
陣列也照樣能解決,原來是:ff ccc iiii vvvvvvvv
,2+3不足8,2+3+4超過了8,所以給f補3位,然後i補4位,也就是2+3+3+4+4+8=24
最後來個特殊的,計算n的大小:
struct node;
struct n;
按上面的方法可知node佔12,那麼按上面的方法,n是不是該佔24?錯了,在n裡的node應該按cccc iiii pppp
處理,這樣n就佔16.
這條預處理命令也好理解了,只要把上面規則中最大變數的大小換成n就行,注意假設結構體中最大元素佔記憶體m,當n如果超過m是不起作用的。
1.類的大小為類的非靜態成員資料的型別大小之和,也就是說靜態成員資料不作考慮。
2.普通成員函式和建構函式與sizeof無關。
3.虛函式由於要維護在虛函式表,所以要佔據乙個指標大小,也就是4位元組。
4.類的總大小也遵守位元組對齊規則。
將類定義如下:
class base
{public:
base();
explicit base(int a);
virtual ~base();
void test();
virtual
void test_virtual();
private:
void
foo();
protected:
int m;
執行sizeof的結果是8,如果把虛析構函式去掉就變成4,再把int m
去掉就變成了1,實際是空類,但是空類例項化也要在記憶體占用位址,由編譯器新增乙個位元組以區分不同物件。 結構體與位元組對齊
在結構體的定義中,經常遇到位元組對齊的問題,尤其是在網路程式中。一 什麼是位元組對齊?在計算乙個結構體的sizeof值時,並不是簡單了計算結構體各成員的大小的和,而應考慮到各成員間和整個結構體的位元組對齊問題。如struct s sizeof struct s 的結果並不是1 4 2 7,而是1 3...
位元組對齊與結構體大小
先讓我們看四個重要的基本概念 1.資料型別自身的對齊值 對於char型資料,其自身對齊值為1,對於short型為2,對於int,float,double型別,其自身對齊值為4,單位位元組。2.結構體或者類的自身對齊值 其成員中自身對齊值最大的那個值。3.指定對齊值 pragma pack value...
結構體位元組對齊與位域
code advance struct c includestruct person int main 1.本身的成員變數型別 2.結構體存在位元組對齊 結構體內部最大的單成員型別的整數倍 如果下乙個成員無法在有限的空間存放則需要乙個額外的空間存放 3.如何優化位元組對齊 1.按照有限空間合理排布成...