結構體與類的位元組對齊 終極方案,簡單易懂

2021-08-22 08:54:52 字數 1531 閱讀 4318

先記住常用型別在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.按照有限空間合理排布成...