編者:李國帥
時間: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).