一个类的实例化对象所占空间的大小

sizeof 统计实例化对象内存大小的规则详解 一个实例化对象空间大小? 注意不要说大小,是对象大小。  首先,大小是什么?确切的说,只是一个型定义,它是没有大小可言的。 用sizeof运算符对一个型名操作,得到的是具有该型实体的大小。add charles 空结构体:struct d{} 的sizeof也是1。 具体规则如下: 1:sizeof统计的是内存四区中的堆和栈里面的数据,而不包含数据区和代码区,因... 阅读详情

注意不要说类的大小,是类的对象的大小.

首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的。

sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。

如果

Class A;

A obj;

那么sizeof(A)==sizeof(obj)

那么sizeof(A)的大小和成员的大小总和是什么关系呢,很简单,一个对象的大小大于等于所有非静态成员大小的总和

为什么是大于等于而不是正好相等呢?超出的部分主要有以下两方面:

1) C++对象模型本身

对于具有虚函数的类型来说,需要有一个方法为它的实体提供类型信息(RTTI)和虚函数入口,常见的方法是建立一个虚函数入口表,这个表可为相同类型的对象共享,因此对象中需要有一个指向虚函数表的指针,此外,为了支持RTTI,许多编译器都把该类型信息放在虚函数表中。但是,是否必须采用这种实现方法,C++标准没有规定,但是这几户是主流编译器均采用的一种方案。

2)编译器优化

因为对于大多数CPU来说,CPU字长的整数倍操作起来更快,因此对于这些成员加起来如果不够这个整数倍,有可能编译器会插入多余的内容凑足这个整数倍,此外,有时候相邻的成员之间也有可能因为这个目的被插入空白,这个叫做“补齐”(padding)。所以,C++标准紧紧规定成员的排列按照类定义的顺序,但是不要求在存储器中是紧密排列的。

基于上述两点,可以说用sizeof对类名操作,得到的结果是该类的对象在存储器中所占据的字节大小,由于静态成员变量不在对象中存储,因此这个结果等于各非静态数据成员(不包括成员函数)的总和加上编译器额外增加的字节。后者依赖于不同的编译器实现,C++标准对此不做任何保证。

C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1

如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态的关键。而虚函数本身和其他成员函数一样,是不占用对象的空间的。

我们来看下面一个例子:(此例子在Visual C++编译器中编译运行)

?

#include <iostream>

usingnamespacestd;

classA

{

};

classB

{

charch;

voidfunc()

{

}

};

classC

{

charch1; //占用1字节

charch2; //占用1字节

virtualvoidfunc()

{

}

};

classD

{

intin;

virtualvoidfunc()

{

}

};

voidmain()

{

A a;

B b;

C c;

D d;

cout<<sizeof(a)<<endl;//result=1

cout<<sizeof(b)<<endl;//result=1 //对象c扩充为2个字,但是对象b为什么没扩充为1个字呢?大家帮忙解决

cout<<sizeof(c)<<endl;//result=8

//对象c实际上只有6字节有用数据,但是按照上面第二点编译器优化,编译器将此扩展为两个字,即8字节

cout<<sizeof(d)<<endl;//result=8

}

综上所述:

一个类中,虚函数、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的。

对象大小= vptr(可能不止一个) +所有非静态数据成员大小 + Aligin字节大小(依赖于不同的编译器)

?

#include <iostream>

usingnamespacestd;

classdemo1{

};

classdemo2{

staticintnum;

};

classdemo3{

virtualintprint(){}

virtualintprint1(){}

};

classdemo4{

voidprint(){}

staticvoidprint1(){}

};

classdemo5{

chara;

};

int_tmain(intargc, _TCHAR* argv[])

{

cout<<"空类的大小为:"<<sizeof(demo1)<<endl;

//当类不包含虚函数和非静态数据成员时,其对象大小也为1

cout<<"当类不包含虚函数和非静态数据成员时,其对象大小也为:"<<sizeof(demo2)<<endl;

cout<<"与类中虚函数的个数无关"<<sizeof(demo3)<<endl; //大小是4,与类中虚函数的个数无关,

cout<<"成员函数(静态和非静态)也不占用类对象的存储空间"<<sizeof(demo4)<<endl;

cout<<sizeof(demo5)<<endl;

demo5 d;

cout<<sizeof(d)<<endl;

return0;

}

MATLAB 论文复现——含氢综合能源系统多目标最优折中分布鲁棒低碳调度 提出基于多目标决策理论和逼近理想解排序技术,构造综合考虑系统调度的经济性、低碳性和鲁棒度的多目标最优折中函数,从而建立含氢综合能源系统多目标最优折中分布鲁棒低碳调度模型,可快速准确地获得兼具经济性、低碳性和鲁棒性的含氢综合能源系统优化调度方案。[1]孙惠娟,胡紫平,彭春华,等.含氢综合能源系统多目标最优折中分布鲁棒低碳调度[J/OL].电力自动化设备,1-13[2024-07-26].https://doi.org/10.16081/j.epae.202406003.关键词: 综合能源系统; 阅读详情

相关推荐

一个C++实例化对象空间大小

首先,大小是什么?确切的说,只是一个型定义,它是没有大小可言的。         用sizeof运算符对一个型名操作,得到的是具有该型实体的大小

程序猿老樊的博客 576

C++中定义对象:用new和不用new有何区别?

举个简单的例子: class Point { private: int x; int y; public: void Set(int a,int b) { x=a; y=b; } void Print() { cout<<"("<<x<<","<<y<<")"<<endl;

IEEEITU的专栏 1553

【YOLOv11多模态融合改进】(可见光+红外)涉及像素级融合、特征级融合(中期、中后期、后期)、决策级融合的完整配置步骤以及二次改进方案

在网络输入阶段将多模态数据直接合并,形成统一的特征表示。

Limiiiing的博客 1883

C++成员函数在内存中的存储方式

去定义对象时,系统会为每一个对象分配存储空间。如果一个包括了数据和函数,要分别为数据和函数的代码分配存储空间。按理说,如果用同一个定义了10个对象,那么就需要分别为10个对象的数据和函数代码分配存储单元,如下图所示。 能否只用一段空间来存放这个共同的函数代码段,在调用各对象的函数时,都去调用这个公用的函数代码。如下图所示。 显然,这样做会大大节约存储

Hopefully Sky的博客 4万+

实例化 对象的内存模型 及 内存用分析

文章目录前言简单的内存模型理解静态成员属性和方法的特点只有对象才会有内存模型!!成员函数如何获取对象数据??基与派生的内存分配派生继承基的内存用情况分析 前言 下面的工具查看对象的内存模型: 利用VS查看内存模型 简单的内存模型 首先,明白一个的组成及其内存模型分布。如下图所示,的成员中除了普通成员变量之外,其他的均不存储在对象的存储空间中,只存储在静态区。 也就是说,一个可以实例化n个对象,除了普通成员变量分别存储在n个对象的内存空间中,其他的成员在内存中只有一份。即,一个

四库全书的酷 1749

从桌面弹窗到硬件通知:拆解Linux下D-Bus如何成为系统组件的“消息中枢”

本文深入解析Linux系统中D-Bus如何作为核心消息中枢,协调硬件事件、系统服务和桌面环境之间的通信。通过总线架构设计、消息传递机制和服务激活策略,D-Bus实现了高效资源管理和流畅用户体验,成为现代Linux桌面生态不可或缺的组件。

weixin_33743661的博客 302

一个实例化对象空间大小

一个实例化对象空间大小? 注意不要说大小,是对象大小. 首先,大小是什么?确切的说,只是一个型定义,它是没有大小可言的。 用sizeof运算符对一个型名操作,得到的是具有该型实体的大小。 如果 Class A; A obj; 那么sizeof(A)==sizeof(obj) 那么sizeof(A)的大小和成员的大小总和是什么关系呢,很简单,一个对象大小大于等于所有

lichunming83的专栏 3835

c++实例化内存的大小计算

 c++实例化内存的大小计算转载)http://hi.baidu.com/yangbme/blog/item/b29c6e430fc428179313c686.html初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却 大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言

SearchLife的专栏 1642

33、一个实例化对象空间大小

一个实例化对象空间大小? 注意不要说大小,是对象大小。 首先,大小是什么?确切的说,只是一个型定义,它是没有大小可言的。 用sizeof运算符对一个型名操作,得到的是具有该型实体(对象)的大小。 如果 Class A; A obj; 那么sizeof(A)==sizeof(obj)。 一个对象大小大于等于所有非静态成员大小的总和。 为什么是大于等于而不是...

weixin_34037977的博客 150

C++中对象空间大小

C++中对象空间大小 http://www.cnblogs.com/easonpan/archive/2012/04/25/2470177.html   首先,平时所声明的只是一种型定义,它本身是没有大小可言的。 因此,如果用sizeof运算符对一个型名操作,那得到的是具有该型实体的大小。    计算一个对象大小时的规律: 空、单一继承的空

anhkgg的专栏 7796

simulink三电平背靠背变流器控制永磁同步电机

simulink模型,三电平背靠背变流器控制永磁同步电机,永磁同步电机给定变化转矩。基本按照3MW参数设计的仿真,主要分为三个功能:电机矢量控制(机侧带前馈补偿,网侧电流环带限幅),机侧带中点电压平衡的SVPWM算法(为模型跑得快只用pi或滞环得冗余小矢量的时间分配因子),模拟电网跌落至40%时机组的低电压穿越控制(无功反应迅速,满足国标75ms),欢迎下载讨论!

上一篇: 基数排序
下一篇: 选择排序之堆排序
happylife1527
博客等级 码龄14年 163粉丝 8原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值