[转]内存分配malloc, new , heapalloc
malloc,new,VirtualAlloc,HeapAlloc性能(速度)比较
http://www.cppblog.com/woaidongmao/archive/2011/08/12/153160.aspx
这里比较的VC++编译的C++代码中的性能
我用的是VC6.0测试的
就不介绍这几个的用法了
我写了一段简单的测试代码
测试结果是:
malloc:390
new:391
VirtualAlloc:454
HeapAlloc:47
很明显的是HeapAlloc分配速度最快,malloc次之,new和malloc差不多,VirtualAlloc最慢了(以前小强跟我说这个最快)
我有跟踪了一下
new调用了这段代码
- void * __cdecl _nh_malloc (
- size_t nSize,
- int nhFlag
- )
- {
- return _nh_malloc_dbg(nSize, nhFlag, _NORMAL_BLOCK, NULL, 0);
- }
malloc函数是这样的:
- _CRTIMP void * __cdecl malloc (
- size_t nSize
- )
- {
- return _nh_malloc_dbg(nSize, _newmode, _NORMAL_BLOCK, NULL, 0);
- }
很明显,new和malloc最终调用相同的_nh_malloc_dbg,只是new多了一次函数调用
再继续跟下去,发现最终调用的是return HeapAlloc(_crtheap, 0, size);
基本上真相大白了
VirtualAlloc跟踪不进去,如果说分配的是虚拟内存的话,有可能会慢吧。
回头再认真看看《Windows核心编程》这本书!
欢迎指正!欢迎交流!
测试代码如下:
- /******************************************************************
- *
- * Copyright (c) 2008, xxxx
- * All rights reserved.
- *
- * 文件名称:main.cpp
- * 摘 要: 测试申请内存的速度
- *
- * 当前版本:1.0
- * 作 者:吴会然
- * 完成日期:2008-11-30
- *
- * 取代版本:
- * 原 作者:
- * 完成日期:
- *
- ******************************************************************/
- #include <iostream>
- #include <windows.h>
- using namespace std;
- int main( int argc, char *argv[] )
- {
- int i = 0;
- DWORD dw1 = 0, dw2 = 0, dw3 = 0, dw4 = 0;
- DWORD dwStart = 0;
- DWORD dwEnd = 0;
- for( int j = 0; j < 10; j++ )
- {
- dwStart = ::GetTickCount();
- for( i = 0; i < 20000; i++ )
- {
- char *pDest1 = (char *)malloc(4096);
- free( pDest1 );
- }
- dwEnd = ::GetTickCount();
- cout << "malloc 10000次4096大小的内存块,耗时" << dwEnd - dwStart << endl;
- dw1 += dwEnd - dwStart;
- dwStart = ::GetTickCount();
- for( i = 0; i < 20000; i++ )
- {
- char *pDest2 = new char[4096];
- delete pDest2;
- }
- dwEnd = ::GetTickCount();
- cout << "new 10000次4096大小的内存块,耗时" << dwEnd - dwStart << endl;
- dw2 += dwEnd - dwStart;
- dwStart = ::GetTickCount();
- for( i = 0; i < 20000; i++ )
- {
- void* pMem = ::VirtualAlloc(NULL, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE );
- ::VirtualFree(pMem, 0, MEM_RELEASE);
- }
- dwEnd = ::GetTickCount();
- cout << "VirtualAlloc 10000次4096大小的内存块,耗时" << dwEnd - dwStart << endl;
- dw3 += dwEnd - dwStart;
- HANDLE hHeap = ::HeapCreate(HEAP_NO_SERIALIZE, 0, 0);
- dwStart = ::GetTickCount();
- for( i = 0; i < 20000; i++ )
- {
- void* pMem2 = ::HeapAlloc(hHeap, HEAP_NO_SERIALIZE, 4096 );
- ::HeapFree(hHeap, HEAP_NO_SERIALIZE, pMem2);
- }
- dwEnd = ::GetTickCount();
- cout << "HeapAlloc 10000次4096大小的内存块,耗时" << dwEnd - dwStart << endl;
- dw4 += dwEnd - dwStart;
- }
- cout << "malloc:" << dw1 << endl;
- cout << "new:" << dw2 << endl;
- cout << "VirtualAlloc:" << dw3 << endl;
- cout << "HeapAlloc:" << dw4
====================================
转】李玮剑 评论
1 把分配的内存空间改为4M甚至更高(循环次数减少)试试,结果截然不同。处理M级的大文件时,用VirtualAlloc效率高
2 博主的测试需要考究,系统在创建线程时就已经预先在线程的堆栈段中提交了两个页面。 按照我的观点new和malloc只要消耗的内存没有超过页面大小就不会实际的进行存储器的保留与提交。二者的操作不在一个层面上。
3 在分配大于一个页面数据的时候 virtualAlloc才有意义
4 virtualAlloc是操作系统提供的最根本的内存分配接口。HeapAlloc预先使用virtualAlloc申请了大块的内存,并根据优化算法组织了用于内存管理的数据结构,主要是对小内存分配的优化 new和malloc是语言层面接口,由于HeapAlloc已经有了优化,所以vc中的malloc并没有使用更多的优化算法,直接转入 HeapAlloc。
内存管理有三种方式:
https://blog.csdn.net/zj510/article/details/39400087
1. 虚拟内存,VirtualAlloc之类的函数
2. 堆,Heapxxx函数,malloc,new等
3. 内存映射文件,Memory Mapped File
很多人都会困惑,但是看下面的图片就会比较明白了。这个图片从MSDN上拷来。
堆和虚拟内存,从上面的图片就可以看出,其实所谓的堆,也就是在虚拟内存上抽象出来的。如果直接用Virtualxxx系列函数,是有一些限制的,比如每次只能分配页大小倍数的内存,内存地址也必须对齐什么的。新手很难用。正因为如此,才出现了堆。实际上堆Heap内部就是使用Virtual系列函数的。基本思想就是:先用VirtualAlloc分配一个比较大的内存,然后用户每次申请堆内存的时候,从分配出来的虚拟内存块上指定一块给用户。比如第一次分配堆内存从A地址开始的100个字节,第二次分配的时候就是A+100开始。
Memory Mapped File就不太一样了,从上面的图可以看出MMF并没有调用Virtual系列函数。它直接调用内核层了。
对于malloc和new,这2个并不是操作系统API,它们是语言提供的函数。在不同的系统上面有不同的实现方法,在Windows上面,new调用malloc,malloc调用堆函数(heapxxx),堆函数调用Virtual系列函数。在Linux上面就调用相应的linux API.
[转]内存分配malloc, new , heapalloc的更多相关文章
- Win内存分配函数(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc)
Win内存分配函数(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc) 来源:http://blog.csdn.net/chunyexiyu/article/ ...
- 转: Linux C 动态内存分配 malloc及相关内容 .
一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...
- 数据结构基础——指针及动态内存分配(malloc)
一.指针 C语言中的指针是一种数据类型,比如说我们用int *a;就定义了一个指针a,它指向一个int类型的数.但是这个指针是未初始化的,所以,一般的,我们都在创建指针时初始化它,以免出错,在还不吃的 ...
- c语言中的内存分配malloc、alloca、calloc、malloc、free、realloc、sbr
C语言跟内存分配方式 (1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2) 在栈上创建.在执行函数时,函数内局部变 ...
- 关于c语言内存分配,malloc,free,和段错误,内存泄露
1. C语言的函数malloc和free (1) 函数malloc和free在头文件<stdlib.h>中的原型及参数 void * malloc(size_t size ...
- 内存分配malloc函数注意事项。
malloc的全称是memory allocation,中文叫动态内存分配,用于向系统申请分配指定字节的内存空间 原型:extern void *malloc(unsigned int num_byt ...
- Linux C 动态内存分配--malloc,new,free及相关内容
一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...
- c语言内存分配-malloc
malloc 原型:(原来返回类型是char) extern void *malloc(unsigned int num_bytes); 头文件: #include <stdlib.h> ...
- c++ 动态数组,指针与动态内存分配
教学内容: 内存的使用 动态内存分配malloc函数 分配内存时使用sizeof运算符 用指针访问内存 以数组的形式访问内存 一.内存的使用 堆(heap) 在程序执行期间分配内存时,内存区域中的这个 ...
随机推荐
- 三、存储过程(Stored Procedure)与游标(Cursor)
一.存储过程 一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数,来执行它. 在大型数据库中,存储过程和触发器具有重要的作用.无论是存储过程还是触发器,都 ...
- Cppcheck - A tool for static C/C++ code analysis
cppcheck是一个个检测源码的工具,对编译工具的一个补充,mark Cppcheck - A tool for static C/C++ code analysis Syntax: cppchec ...
- free结果解释
free用于查询内存使用情况,不过其多个数值经常让人感到迷惑,下边对其结果各值进行解释. Mem 1862--总内存/1770--已使用内存/92--未使用内存/199--输出缓存/637--输入缓存 ...
- linux nginx 添加到全局变量中(环境变量)
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/ /usr/local/bin/就是环境变量目录
- 【Jmeter基础知识】Jmeter响应断言和断言结果
一.Jmeter创建一个响应断言 1.步骤:添加--断言--响应断,进入响应断言页面 2.断言内容:可以采用直接去搜索某些文本信息,或者可以去断言某个变量,如图 二.Jmeter创建一个断言结果 1. ...
- learning rndis protocol
reference: https://docs.microsoft.com/en-us/windows-hardware/drivers/network/overview-of-remote-ndi ...
- html5游戏之Box2d物理引擎集成
前面两章我们已经研究了如何使用Box2d来模拟游戏世界,这一章就把所有的东西拼凑在一起,最终完成我们的游戏. 一.定义物体 典型的物体: {type:'ground',name:'dirt',x:50 ...
- unity中实现三个Logo图片进行3秒钟的若隐若现后互相切换Logo图片
private List<Sprite> storeTexture; public void Start() { storeTexture = new List<Sprite> ...
- python 笔记数据类型
python基础: 采用缩进方式 4个空格的缩进 大小写敏感 数据类型和变量 数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值,但是,计算机能处理的 ...
- Java 算法 概念汇总
编程面试的10大算法概念汇总 以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java ...