C++类所占内存大小计算

profiler分析c++进程内存占用 背景 在比较大的工程中,进程的内存占用分析是很重要的一环,可以分析出各个模块的内存占用,也可以接下来对内存占用大的模块进行优化等等。Google Profiler工具可以简单、快捷的打印出每个函数的内存占比。 安装 wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.5/gperftools-2.5.tar.gz ./configure make -j 32 make install 使用 加载执. 阅读详情

C++类所占内存大小计算

转载时请注明出处和作者联系方式
文章出处:
http://blog.youkuaiyun.com/chenchong08
作者联系方式:vision_chen@yeah.net

说明:笔者的操作系统是32位的。

class A {};
sizeof( A ) = ?
sizeof( A ) = 1
明明是空类,为什么编译器说它是1呢?
空类同样可以实例化,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以sizeof( A )的大小为1.

 
class B
{
public:
  B() {}
  ~B() {}
  void MemberFuncTest( int para ) { }
  static void StaticMemFuncTest( int para ){  }
};
sizeof( B ) = ?
sizeof( B ) = 1
类的非虚成员函数是不计算在内的,不管它是否静态。


class C
{
 C(){}
 virtual ~C() {}
};
sizeof( B ) = ?
sizeof( B ) = 4
类D有一个虚函数,存在虚函数的类都有一个一维的虚函数表叫虚表,虚表里存放的就是虚函数的地址了,因此,虚表是属于类的。这样的类对象的前四个字节是一个指向虚表的指针,类内部必须得保存这个虚表的起始指针。在32位的系统分配给虚表指针的大小为4个字节,所以最后得到类C的大小为4.


class D
{
 D(){}
 virtual ~D() {}
 virtual int VirtualMemFuncTest1()=0;
 virtual int VirtualMemFuncTest2()=0;
 virtual int VirtualMemFuncTest3()=0;
};
sizeof( D ) = ?
sizeof( D ) = 4
原理同类C,不管类里面有多少个虚函数,类内部只要保存虚表的起始地址即可,虚函数地址都可以通过偏移等算法获得。


class E
{
 int  m_Int;
 char m_Char;
};
sizeof( E ) = ?
sizeof( E ) = 8
32位的操作系统int占4个字节,char占一个字节,加上内存对齐的3字节,为8字节。


class F : public E
{
 static int s_data ;
};
int F::s_data=100;
sizeof( F ) = ?
sizeof( F ) = 8
类F为什么跟类E一样大呢?类F的静态数据成员被编译器放在程序的一个global data members中,它是类的一个数据成员,但是它不影响类的大小,不管这个类实际产生了多少实例还是派生了多少新的类,静态成员数据在类中永远只有一个实体存在,而类的非静态数据成员只有被实例化的时候,他们才存在.但是类的静态数据成员一旦被声明,无论类是否被实例化,它都已存在.可以这么说,类的静态数据成员是一种特殊的全局变量.


class G : public E
{
 virtual int VirtualMemFuncTest1(int para)=0;
 int m_Int;
};
class H : public G
{
 int m_Int;
};
sizeof( G ) = ?
sizeof( H ) = ?
sizeof( G ) = 16
sizeof( H ) = 20
可以看出子类的大小是本身成员的大小再加上父类成员的大小.如果父类还有父类,也加上父类的父类,这样一直递归下去。


class I : public D
{
 virtual int VirtualMemFuncTest1()=0;
 virtual int VirtualMemFuncTest2()=0;
};
sizeof( I ) = ?
sizeof( I ) = 4
父类子类工享一个虚函数指针,虚函数指针保留一个即可。

总结:
空的类也是会占用内存空间的,而且大小是1,原因是C++要求每个实例在内存中都有独一无二的地址。
(一)类内部的成员变量:
普通的变量:是要占用内存的,但是要注意内存对齐(这点和struct类型很相似)。
static修饰的静态变量:不占用内存,原因是编译器将其放在全局变量区。
从父类继承的变量:计算进子类中
(二)类内部的成员函数:
非虚函数(构造函数、静态函数、成员函数等):不占用内存。
虚函数:要占用4个字节(32位的操作系统),用来指定虚拟函数表的入口地址。跟虚函数的个数没有关系。父类子类工享一个虚函数指针。

        构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是this指针。成员函数为该类所有对象共享,不仅是处于简化语言实现、节省存储的目的,而且是为了使同类对象有一致的行为。同类对象的行为虽然一致,但是操作不同的数据成员。

 

测试代码如下:

  1. <span style="font-size:18px;">/* 
  2.  * file name   : main.cpp 
  3.  * description : test the size of c++'s class 
  4.  * create on   : 2012-05-31 
  5.  * create by   : chenchong 
  6.  * email         : vision_chen@yeah.net 
  7.  */  
  8.   
  9. #include<iostream>  
  10.   
  11. using namespace std;  
  12.   
  13. class A {};   
  14.   
  15. class B   
  16. {  
  17. public:  
  18.   B() {}  
  19.   ~B() {}  
  20.   void MemberFuncTest( int para ) { }  
  21.   static void StaticMemFuncTest( int para ){  }  
  22. };  
  23.   
  24. class C   
  25. {  
  26.  C(){}  
  27.  virtual ~C() {}  
  28. };  
  29.   
  30. class D   
  31. {  
  32.  D(){}  
  33.  virtual ~D() {}  
  34.  virtual int VirtualMemFuncTest1()=0;  
  35.  virtual int VirtualMemFuncTest2()=0;  
  36.  virtual int VirtualMemFuncTest3()=0;  
  37. };  
  38.   
  39. class E  
  40. {  
  41.  int  m_Int;  
  42.  char m_Char;  
  43. };  
  44.   
  45. class F : public E  
  46. {  
  47.  static int s_data ;  
  48. };  
  49. int F::s_data=100;  
  50.   
  51. class G : public E  
  52. {  
  53.  virtual int VirtualMemFuncTest1(int para)=0;  
  54.  int m_Int;  
  55. };  
  56. class H : public G  
  57. {  
  58.  int m_Int;  
  59. };  
  60.   
  61. class I : public D  
  62. {  
  63.  virtual int VirtualMemFuncTest1()=0;  
  64.  virtual int VirtualMemFuncTest2()=0;  
  65. };  
  66.   
  67. int main( int argc, char **argv )  
  68. {  
  69.  cout<<"sizeof( A ) = "<<sizeof( A )<<endl;  
  70.  cout<<"sizeof( B ) = "<<sizeof( B )<<endl;  
  71.  cout<<"sizeof( C ) = "<<sizeof( C )<<endl;  
  72.  cout<<"sizeof( D ) = "<<sizeof( D )<<endl;  
  73.  cout<<"sizeof( E ) = "<<sizeof( E )<<endl;  
  74.  cout<<"sizeof( F ) = "<<sizeof( F )<<endl;  
  75.  cout<<"sizeof( G ) = "<<sizeof( G )<<endl;  
  76.  cout<<"sizeof( H ) = "<<sizeof( H )<<endl;  
  77.  cout<<"sizeof( I ) = "<<sizeof( I )<<endl;  
  78.   
  79. #if defined( _WIN32 )  
  80.  system("pause");  
  81. #endif  
  82.  return 0;  
  83. }  
  84.   
  85. </span>  


 

Windows 7 32位 VC 2010运行结果:

Linux(cent os 6.2 32位)运行结果:

 

c++获取单个内存条的使用率,内存频率、内存类型、内存的容量 【代码】c++获取单个内存条的使用率,内存频率、内存类型、内存的容量。 阅读详情

相关推荐

HDRP shader 获取阴影(Custom Pass)

Unity:2021.3.0f1 HDRP:12.1.6

LanQ的博客 2099

C++得到当前进程所占用的内存

http://blog.youkuaiyun.com/genliu777/article/details/7260501

记得评论哦 4319

关于三维全波电磁场仿真软件CST的安装和问题解决

百度网盘链接:https://pan.baidu.com/s/1RgWr8Qau1EzSOlh29SewFQ提取码:fzza这里是2023版本的CST,需要其他版本的uu们可以去官网或者其他人的网盘下载。

weixin_60728441的博客 3616

C/C++获取Linux系统内存使用情况

我们在Linux系统上常常会定时统计系统的Memory信息,从而排查一些其他的问题,在Linux 中,我们可以使用如下方式查看系统情况: (1)free -m (2)cat /proc/meminfo 在程序中我们可以定时统计这些信息,那么我们可以使用如下方式: 方法一:该方法比较简单,但是有缺陷,每个系统的字段顺序不一样,可能会存在一些错误 //proc/meminfo文件结...

Swallow_he的博客 6374

手把手教你用HarmBench数据集测试大模型安全性(含多模态案例)

本文详细介绍了如何使用HarmBench数据集测试大模型的安全性,包括文本和多模态越狱指令的实战案例。通过环境配置、数据集获取、测试流程及结果分析,帮助开发者全面评估和提升大模型的安全防护能力,特别关注多模态攻击的防御策略。

weixin_26642481的博客 328

宇树G1嵌入式软件架构及技术实现

该架构通过硬件加速(FPGA)+确定性调度(RTX5)的组合,在1ms控制周期内完成从传感器采集到43轴输出的全链路处理,相比波士顿动力系统缩短40%的着地稳定时间。,结合ARM Cortex-R5与FPGA的异构计算能力,实现43自由度1kHz实时控制。

m0_60674045的博客 4311

c++类占内存空间大小计算

x64环境下实现: 1 #include <iostream> 2 3 using namespace std; 4 5 class kong{ 6 7 }; 8 9 class kong1{ 10 11 }; 12 13 class kong2{ 14 15 }; 16 ...

allen2111的博客 472

CMake入门教程【基础篇】CMake+Visual Studio2022构建C++项目

CMake+Visual Studio2022搭建C++环境

小鱼酱的博客 4971

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

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

SearchLife的专栏 1646

PCL CSF布料模拟算法【2026最新版】

CSF布料模拟地面滤波算法的PCL实现,博客长期更新,本文最近更新时间为:2026年10月26日。

点云侠的博客 3918

传统(经典)粒子群算法(PSO)解决单目标优化问题

智能算法:粒子群算法(particle swarm optimizer)—PSO %原理:(1)种群初始化–N(种群数)–D(个体数)–x(i)(粒子位置)–v(i)(粒子速度) % (2)计算每个粒子的适应度值–而适应度值需要选择适应度函数 % (3)对于每个粒子,使用它的适应度值fit[i]和个体的极值pbest(i)进行比较,如果fit[i]>pbest(i),则pbest(i)=fit[i] % (4)同理,对每个粒子用它的适应值与全局极值进行比较,如果比它大,则

weixin_51631044的博客 1295

C++类的实例化后占内存的大小计算

C++类的实例化后占内存的大小计算1.为类的非静态成员数据的类型大小之和. 2.有编译器额外加入的成员变量的大小,用来支持语言的某些特性(如:指向 虚函数的指针). 3.为了优化存取效率,进行的边缘调整. 4 与类中的构造函数,析构函数以及其他的成员函数无关 例: (转载) 初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码 与最终生编译成的

编程爱好者 1044

基于转录逆转的药物重定向 GPS 模型

GPS是一个基于分子结构预测基因表达扰动的开源平台,由三个模块组成:RCL(在LINCS扰动数据上训练抗噪MLP)、GPS4Drugs(预测新化合物的基因表达谱并进行逆转评分)、MolSearch(基于MCTS的分子优化)。平台使用Morgan指纹和Gene Ontology注释作为特征输入,将基因表达扰动离散为三分类标签。训练数据来自LINCS Phase I的18,746个化合物和978个landmark基因,支持四细胞系独立训练,可用于药物重定向与化合物筛选。

听雨草堂 83

转载:C++类所占内存大小计算

原文:http://blog.sina.com.cn/s/blog_69c189bf0100mkeu.html#cmt_50E7D65F-7F000001-A3DDC97D-8C3-8A0 &amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算在内的。 摘抄部分: &amp;amp;nbsp;&amp;amp;nbsp;

风知我意否的博客 875

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++类的所占内存大小计算)

用sizeof(类) 1.类中没有虚函数:sizeof

adamvscele的专栏 360

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: VS2008 中右键“转到定义”弹出“未定义符号” 的解决办法。
下一篇: Qt TableView动态更新
Maybe______
博客等级 码龄10年 26粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值