编者:李国帅
时间: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).
return 1;
}
标签:函数,int,double,void,char,大小,class,struct From: https://blog.51cto.com/u_15720208/5734880