• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2021-08-15 14:34 Aet 隐藏边栏 |   抢沙发  8 
文章评分 2 次,平均分 5.0

进程内存空间布局

  1. 当运行一个可执行文件时,操作系统就会把这个可执行文件加载到内存中,此时进程就会有一个虚拟的地址空间(内存空间)。

  1. BSS存放未初始化或者初始化为0的全局变量。
  2. Linux下,可以通过nm列出可执行文件中的全局变量的地址。
  3. 全局变量以及全局的函数在编译时就已经分配了地址了,这个地址是固定的线性地址,不管程序运行多少次,运行多少个实例,它的线性地址始终是确定的,而且是唯一的线性地址。
    (线性地址通过分页机制转换成物理地址)

数据成员布局

  1. 普通成员的存储顺序,和在类中的定义顺序是有关的。
    (类中先定义的变量,在内存中的地址是低地址)

  2. 一字节对齐和恢复编译器的默认对齐

  1. 成员变量的偏移值

静态类型和动态类型

  1. 对象定义时的类型,编译期间就确定好的。
  2. 运行时才决定的类型。
    一般只有指针或引用才有动态类型的说法。

静态绑定和动态绑定

  1. 静态绑定
    1. 绑定的是静态类型,所对应的函数或者属性依赖于对象的静态类型,发生在编译期。比如普通的成员函数。
  2. 动态绑定
    1. 绑定的是动态类型,所对应的函数或属性依赖于对象的动态类型,发生在运行期。比如虚函数。

rtti

  1. 虚函数表往上的四个地址是rtti的地址
    1. 然后这个rtti的地址往下12个字节是type_info的地址

全局变量的构造和析构

  1. 全局变量是放在数据段中的。
  2. 全局对象不给初值的情况,编译器会默认把全局对象所在的内存全部清0。
  3. 全局变量在编译阶段就会把空间分配出来(地址是在编译期间就确定好的)。
  4. 全局对象在main函数执行之前就被构造完毕,在main函数执行完毕后才被析构掉。

new a()和new a

  1. 对于一个空类而言,是没有区别的。
  2. 如果类A中有成员变量,带括号的初始化会把一些和成员变量有关的内存清0。(不是对整个对象的内存清0)

new和delete

  1. new先调用了operator new(),里面调用了malloc。然后调用了类的构造函数。
  2. delete先调用了类的析构函数,然后调用了operator delete()。

内存池

原理

  1. 用malloc申请一大块内存,当需要分配内存的时候,就从这一大块内存中一点一点分配。
  2. 当这一大块内存用光了的时候,再用malloc申请一大块内存,再用于分配。

实例

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2021-11-20
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享