天天看點

函數和虛函數對struct結構體大小的影響

編者:李國帥

時間:20

背景:

在網絡傳輸程式中,往往把資料封裝到結構體中統一傳輸,這時候,結構體的大小就會很重要,不注意的話,容易造成資料的丢失或者溢出。

在實際的使用中要注意分析VC的配置設定變量的配置設定政策,這樣的話可以避免一些錯誤。

下面使用例程測試函數對結構體struce或者class大小的影響。

例程:

普通結構體

struct xxx0

{

double y;//8

void* p;//4

char x1;//1

};//16

pack的影響

#pragma pack(push)//儲存對齊狀态

#pragma pack (16)

class xxx22

{

char x;

int z;

double y;

};//16

#pragma pack(pop)//恢複對齊狀态

正常虛函數占用位元組

class xxx20

{

virtual void ff(){}//4

};//4

class xxx21

{

virtual void ff(){}//4

char z;//1

};//8

如果結構體中包含double

struct xxx2

{

double y;//8

virtual void f0(){}//如果單獨計算,在結構體中占用4位元組,但是如果存在double,這個指針總是單獨占用8位元組,其中後面4個位元組沒有資料

char x1;//1

//char x2;//1

//char x3;//1

//char x4;//1

//char x5;//1

//char x6;//1

//char x7;//1

//char x8;//1

};//24

class xxx31

{

virtual void ff(){}//4或8根據是否存在8位元組資料類型定義

char x;//1

double y;//8

int z;//4

};//32

非虛函數不占空間

class xxx30

{

void ff(){}//非虛函數不占空間

char x;//1

double y;//8

int z;//4

};//24

使用最長資料類型對齊

class xxx01

{

int f;//4

char x;//1

double y;//8  使用最長資料類型對齊

int z;//4

};//24

class xxx10

{

char x;//1

double y;//8

int z;//4

};//24

double和long double類型所占空間相同

class xxx11

{

char x;//1

long double y;//8  ;//8//Windows95和Windows   NT中,long   double和double是一緻的。 标準中是10位元組

int z;//4

};//24

靜态成員不占類空間

class xxx12

{

char x;//1

long double y

static int z;// 靜态成員不占空間,靜态變量的存儲位置與結構或者類的執行個體位址無關。

void f(){}//非虛函數不占空間

};//16

多個虛函數隻占用一個指針位置

class xxx3

{

virtual void f0(){}//

virtual void f1(){}//隻有一個指向虛函數清單的指針,是以不管有幾個虛函數隻相當于一個int或者double的大小;

char x;//1

double y;//8

int z;//4

};//32

空類的大小

class xxx00{

};//sizeof(xxx1)=1;

函數指針的長度

int func(char s[5])

{

         cout << sizeof(s) << endl;//4//數的參數在傳遞的時候系統處理為一個指針,是以sizeof(s)實際上為求指針的大小。

         cout << sizeof(func("1234")) << endl;//4//因為func的傳回類型為int,是以相當于//求sizeof(int).

繼續閱讀