C++内存管理笔记(一)
C++内存分配的四个层面 :
四个层面的比较:
内存分配与释放的测试:
); //512 bytes free(p1); complex<int>* p2 = new complex<int>; //one object delete p2; ); //512 bytes ::operator delete(p3); //以下使用 C++ 标准库提供的 allocators。 //其接口虽有标准规格,但实现商业并未完全遵守;下面三者形式略同。 #ifdef _MSC_VER //以下兩函數都是 non-static,定要通過 object 調用。以下分配 3 個 ints. , (); allocator<); #endif #ifdef __BORLANDC__ //以下兩函數都是 non-static,定要通過 object 調用。以下分配 5 個 ints. ); allocator<); #endif #ifdef __GNUC__ //以下兩函數都是 static,可通過全名調用之。以下分配 512 bytes. //void* p4 = alloc::allocate(512); //alloc::deallocate(p4,512); //以下兩函數都是 non-static,定要通過 object 調用。以下分配 7 個 ints. ); allocator<); //以下兩函數都是 non-static,定要通過 object 調用。以下分配 9 個 ints. ); __gnu_cxx::__pool_alloc<); #endif
new关键字的实现:
首先new是被编译器编译成三步: Com * p = new Com(1,2); 等价于 : void * mem = ::operator new(sizeof(Com)); // 内存分配 p = static_cast<Com*>(mem); // 强制类型转换 p->Com::Com(1,2); // 构造函数调用(自己这么写在大部分编译器上不支持,但是实际上只是编译器的实现阻止了这么写)
我们可以知道 new分配内存 是通过 operator new() 函数实现的。
而 operator new() 的函数实现实际上是依靠 malloc 实现的,如下图 :
operator new() 不断地循环调用 malloc(),如若分配内存不成功的话。
但实际上还有另一个操作就是调用 _callnewh(size), 这个函数可以由我们重写。
当malloc也分配不出内存时,就会调用它,我们可以将其重写为 : 释放部分我们认为可以释放的内存,然后下次malloc就能分配到内存了。
而 operator new() 还有第二个参数 : 默认为不报错,如若要报错可以自己指定。
C++内存管理笔记(一)的更多相关文章
- 黑马程序员_ Objective-c 内存管理笔记
引用计数器 当一个对象被创建出来,就要分配给内存这个对象,当不用这个对象的时候,就要及时的回收,为了可以明确知道对象有没有被使用,就要用引用计数器来体现,只要计数器不为0,表明对象被使用中. 1.方法 ...
- Java内存管理笔记
java内存管理机制 在java中,内存管理由JVM完全负责,java中的"垃圾回收器"负责自动回收无用对象占据的内存资源,这样可以大大减少程序猿在内存管理上花费的时间,可以更集中 ...
- ios内存管理笔记(一)
- Linux-3.14.12内存管理笔记【伙伴管理算法(2)】
前面已经分析了linux内存管理算法(伙伴管理算法)的准备工作. 具体的算法初始化则回到start_kernel()函数接着往下走,下一个函数是mm_init(): [file:/init/main. ...
- Linux-3.14.12内存管理笔记【伙伴管理算法(1)】
前面分析了memblock算法.内核页表的建立.内存管理框架的构建,这些都是x86处理的setup_arch()函数里面初始化的,因地制宜,具有明显处理器的特征.而start_kernel()接下来的 ...
- Linux-3.14.12内存管理笔记【构建内存管理框架(5)】
前面已经分析了内存管理框架的构建实现过程,有部分内容未完全呈现出来,这里主要做个补充. 如下图,这是前面已经看到过的linux物理内存管理框架的层次关系. 现着重分析一下各个管理结构体的成员功能作用. ...
- Linux-3.14.12内存管理笔记【构建内存管理框架(2)】
前面构建内存管理框架,已经将内存管理node节点设置完毕,接下来将是管理区和页面管理的构建.此处代码实现主要在于setup_arch()下的一处钩子:x86_init.paging.pagetable ...
- 2. Linux-3.14.12内存管理笔记【系统启动阶段的memblock算法(2)】
memory:表示可用可分配的内存: 结束完memblock算法初始化前的准备工作,回到memblock算法初始化及其算法实现上面.memblock是一个很简单的算法. memblock算法的实现是, ...
- 1. Linux-3.14.12内存管理笔记【系统启动阶段的memblock算法(1)】
memblock算法是linux内核初始化阶段的一个内存分配器(它取代了原来的bootmem算法),实现较为简单.负责page allocator初始化之前的内存管理和分配请求. 分析memblock ...
- Linux-3.14.12内存管理笔记【kmalloc与kfree实现】【转】
本文转载自:http://blog.chinaunix.net/uid-26859697-id-5573776.html kmalloc()是基于slab/slob/slub分配分配算法上实现的,不少 ...
随机推荐
- 【题解】[HNOI2015]菜肴制作(贪心+topo序)
[题解][HNOI2015]菜肴制作(贪心+topo序) 题意:请你构造一个排列\(p[i]\)使得对于数组\(arc[i]=p[i]\)的字典序最小,并且对于给定的有序数对\((u,v)\)保证你给 ...
- 基于 Blazui 的 Markdown 编辑器 Blazui.Markdown 尝鲜
想做一个文档平台用来存放和展示 Blazui 的文档,然后基于 Markdown 写文档,但缺一个好用的 Blazor Markdown 编辑器,所以就顺便写一个了,功能上基本抄的 https://p ...
- Vue+Vant+Vuex实现本地购物车功能
通常,我们做移动端商城的时候,通常会有购物车模块,那购物车模块有两种实现方式,一是储存在后台通过接口获取到购物车信息,二是存在用户手机本地,第一种方法只要调用接口获取比较简单,这里介绍的是第二种方法, ...
- Ant Design Pro中Transfer穿梭框的实际用法(与后端交互)
Ant Design Pro中Transfer穿梭框的实际用法(与后端交互) 该控件的属性以及属性的作用在ADP的官方文档中都有介绍,但没有讲如何与后端交互,本文旨在讲解该控件与后端的交互. Ant ...
- SSM三大框架整合思路
1.Dao层: Mybatis的配置文件:SqlMapConfig.xml 不需要配置任何内容,需要有文件头.文件必须存在. applicationContext-dao.xml: mybatis整合 ...
- Java中数组的使用
1.声明数组 1.1声明一维数组 声明一维数组有下列两种格式: 数组的元素类型 数组名字[ ]; 数组的元素类型[ ] 数组名字 1.2声明二维数组 声明二维数组有下列两种格式: 数组的 ...
- 查找2-n之间素数的个数
题目描述 查找2-n之间素数的个数.n为用户输入值.素数:一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除,就叫素数.如2,3,5,7,11,13,17…. 输入 整数n 输出 2-n ...
- SpringBoot2 整合Nacos组件,环境搭建和入门案例详解
本文源码:GitHub·点这里 || GitEE·点这里 一.Nacos基础简介 1.概念简介 Nacos 是构建以"服务"为中心的现代应用架构,如微服务范式.云原生范式等服务基础 ...
- echarts更改轴线颜色
xAxis : [ { type : 'category', data : ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月 ...
- Scala与Mongodb实践1-----mongodbCRUD
目的:如何使用MongoDB之前提供有关Scala驱动程序及其异步API. 1.现有条件 IDEA中的:Scala+sbt+SDK mongodb-scala-driver的网址:http://mon ...