首页 > 其他分享 >函数和虚函数对struct结构体大小的影响

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

时间:2022-10-07 19:01:58浏览次数:47  
标签:函数 int double void char 大小 class 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).

return 1;

}

 

标签:函数,int,double,void,char,大小,class,struct
From: https://blog.51cto.com/u_15720208/5734880

相关文章

  • 从头开始学MySQL-------存储过程与存储函数(1)
     10.1.1 创建存储过程    存储过程就是一条或者多条SQL语句的集合,可以视为批文件。它可以定义批量插入的语句,也可以定义一个接收不同条件的SQL。    创......
  • 主机字节序和网络字节序转换函数
    #include<arpa/inet.h>uint32_thtonl(uint32_thostlong);<主机字节序转换位网络字节序32,转换IP地址时用>uint16_thtons(uint16_thostshort);<主机字节序16位转换为网......
  • Oracle函数
    Oracle函数一、日期函数  TO_DATE格式(以时间:2007-11-02  13:45:25为例)       Year:             yytwodigits两位年       ......
  • 网络字节与主机节序的转换函数实践
    #include<netinet/in.h>unit16_thtons(uint16_thost16bitvalue);uint32_thtonl(uint32_thost32bitvalue);//均返回网络字节序的值unit16_tntohs(uint16_tnet16bit......
  • Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace
    Oracle使用正则表达式离不开这4个函数:1、regexp_like2、regexp_substr3、regexp_instr4、regexp_replace看函数名称大概就能猜到有什么用了。regexp_like只能用于条件表达......
  • 【我开了C语言金手指】二.函数(2)
    (七)函数递归1.什么是递归?程序调用自身的编程技巧;过程或函数在其定义或说明中有直接或间接调用自身的一种方法,把大型复杂问题转化为一个与原问题相似的规模较小的问题来求解;主......
  • 字符串函数
    常用三类系统函数:1)字符串;2)时间;3)数学1)头文件<string.h>,找C标准库参考手册看即可,里面包含众多C标准库–<string.h>|菜鸟教程(runoob.com)此处提供一个链接仅供参考......
  • 网络字节序与主机字节序的转换函数实践
    网络字节序与主机字节序的转换函数实践1、什么是字节序?字节序,顾名思义,就是字节组织的顺序分为两种,一种是以IBM、Oracle公司为代表的大端序(bigendian),一种是以Intel公司......
  • 网络字节序与主机字节序的转换函数实现
    1、网络字节序:是TCP/IP中一种固定好的数据表示格式,它与具体的CPU,操作系统,传输方式无关,从而可以保证数据在不同主机之间传输时能够兼容。2、主机字节序:即大端(BigEndian)......
  • 模板基类与正确的派生类函数调用--Effective C++ Item 43
    问题描述假设我们有这样一个业务场景,我们管理着许多公司,每个公司都有一个自己的许多日志信息需要处理,于是为了方便,我们写了一个模板类用来处理这些公司的信息,并且将这些公......