函数和虚函数对struct结构体大小的影响

编者:李国帅

qq:9611153 微信lgs9611153

时间: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(){}//48根据是否存在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

 

doublelong double类型所占空间相同

class xxx11

{

         char x;//1

         long double y;//8  ;//8//Windows95Windows   NT中,long   doubledouble是一致的。 标准中是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;

}

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值