如何计算C++类占用内存大小

来源:互联网 发布:win10优化教程 编辑:程序博客网 时间:2024/06/08 06:46
  1. 首先看看C++语言中的内存分类

    • 程序映像,在windows程序执行时会导入exe文件到内存,这个便是程序映像,这里面主要有什么呢
      • 程序块。主要是存储程序源代码编译后的二进制程序文件,函数什么之类的都在这
      • 数据块。主要是存储程序里面的静态数据
      • BBS数据区。存储未初始化的静态成员变量
    • 动态内存分配
      • 堆区。 用来分配程序运行过程中临时申请的存储空间
      • 栈区。 程序的运行栈。存放函数的返回地址,寄存器内容,局部变量等
  2. 计算类中占用内存空间的原则:

    • 非静态成员变量(静态成员变量不在栈空间)
    • 数据对齐处理
    • 虚函数表指针
    • 空类也占用1字节(表示这个类的唯一存在)
  3. 计算时要注意当前编程系统时32位系统还是64位系统
    一般来说32位系统的指针占4字节,并且是4字节对齐,64位系统的指针占8字节,并且是8字节对齐。
    所以计算时虚函数表指针在32位系统下时4字节,64位系统下是8字节

  4. 计算要点:

    • 成员变量。非静态成员变量是占用对象空间的,而静态成员变量是不占用对象空间,因为静态成员变量是属于全局变量,在常量数据区而不在对象的栈空间。
    • 数据对齐。这是针对于成员变量
    • 虚函数表指针。主要参考 CollShell的两篇大作见引用资料[1][2]
      • 一个对象(未继承其他的基类)只有一个虚函数表,也就只有一个虚函数表指针,而不管它有几个虚函数。
      • 如果该对象继承了1个基类,那么自己和基类共用一个虚函数表指针,虚函数表中基类的虚函数指针在表的前面,对象自身的虚函数指针在表的后面
      • 如果继承多个基类,那么对象自身的虚函数指针与第一个有虚函数表的基类合为一起,然后其他有虚函数表指针的依次分别占用虚函数表指针,也就是说此时对象会有多个虚函数表指针,分别指向多个不同虚函数表。
  5. 具体实例请参加以下博文:
    http://qiusuoge.com/8759.html
    http://blog.chinaunix.net/uid-20937170-id-3290357.html
    http://blog.csdn.net/sad_4978/article/details/4646066
    http://blog.sina.com.cn/s/blog_69c189bf0100mkeu.html

  6. coolShell大牛的2篇大作
    [1]C++ 虚函数表解析 http://coolshell.cn/articles/12165.html
    [2]C++ 对象的内存布局 http://coolshell.cn/articles/12176.html

0 0
原创粉丝点击