浅析动态内存分配Malloc二元操作性能教程

在浅析之前先看下 malloc的原型:

void* malloc(size_t size);

这里唯一需要注意到是:

typedef unsigned int size_t;

来段测试程序

#include < stdio.h > int main(int argc, char * argv[]) {
 int i = 0;
 for (; i < 100; i++) {
  malloc(32);
  /**< 每次malloc 32 字节 */
 }
 return 0;
}

编译后,看下内存泄漏:

 

内存泄露

和预计的没错,正好泄漏32*100 bytes

我们放大循环次数和修改,看下运行时间:

int i = 0;
for (; i < 1000000; i++) {
 malloc(1000);
 /**< 每次malloc 1000 字节 */
}

 

real 7.366s

我们这次加大循环次数并且malloc后顺便free掉看看结果:

12345

int i = 0;
for (; i < 1000000; i++) {
 int * mm = malloc(1000);
 /**< 每次malloc 1000 字节 */
 free(mm);
}

结果显示如下:

 

内存泄露

也和预计的一样,二元操作,内存显示正常,

再来看看和第一次相同的循环(100W)浪费多少时间:

real 0.047s

可以看出,是否可以认为内存泄漏直接了影响性能?,且慢,继续看下面

还是和第一个例子相同,如果我们最后一起free掉所有内存,也就没有内存泄漏了,那看看性能如何?

int i = 0;
void * szMM[1000000];
for (; i < 1000000; i++) {
 szMM[i] = malloc(1000);
 /**< 每次malloc 1000 字节 */
}
for (i = 0; i < 1000000; i++) {
 free(szMM[i]);
}

 

无任何内存泄漏,但是运行时间!!

real 9.690s

时间和第一次差不多长,三次测试结果说明什么?

说明性能和内存泄漏没直接关系,第一和第三都有共同的特点,malloc的内存 每次1000bytes 循环100W 不停的累计.而第二个例子是每次malloc都会free掉.,没有释放的内存的最大数量影响了整个程序的性能!

时间: 2024-09-01 09:24:06

浅析动态内存分配Malloc二元操作性能教程的相关文章

指针-一个动态内存分配的问题,函数执行后p指向哪里?

问题描述 一个动态内存分配的问题,函数执行后p指向哪里? 一下是我的代码: #include<stdio.h> #include<stdlib.h> #include<string.h> char *strcnp(char *sd,char *ds) { char *q=sd; while((*ds++=*sd++)!='') NULL; return q; } int main() { char *a[4]={"abc","def&quo

函数参数传递和动态内存分配的问题

问题描述 函数参数传递和动态内存分配的问题 利用下面这段代码进行动态内存分配有什么问题: char *getmemory(int sum) { char *p=NULL; p=(char *)malloc(sum); return p; } int main() { char *str=NULL; str=getmemory(100); strcpy(str,"hello c!"); printf("%sn",str); } 解决方案 你的主程序需要释放内存,否则可

动态内存分配的C代码示例

概述 之前有同学在QQ上问我,C语言中的动态内存分配是怎么回事. 首先,我们来看看内存分配的概念,它是指在程序执行的过程中分配或者回收存储空间的方法.一般说来,内存分配方法分为静态内存分配和动态内存分配两种.在本文中,我们主要讨论动态内存分配. 要实现动态内存分配,就需要有执行这个操作的对象.C语言考虑得很周到,它为我们提供的两个标准库函数:malloc和free. malloc和free函数简介 malloc函数 原型:void *malloc(size_t size); 简介:该函数在内存的

C语言 动态内存分配的详解及实例_C 语言

1. 动态内存分配的意义 (1)C 语言中的一切操作都是基于内存的. (2)变量和数组都是内存的别名.     ①内存分配由编译器在编译期间决定     ②定义数组的时候必须指定数组长度     ③数组长度是在编译期就必须确定的 (3)但是程序运行的过程中,可能需要使用一些额外的内存空间 2. malloc 和 free 函数 (1)malloc 和 free 用于执行动态内存分配的释放 (2)malloc 所分配的是一块连续的内存 (3)malloc 以字节为单位,并且返回值不带任何的类型信息

关于c语言内存分配,malloc,free,和段错误,内存泄露

1.   C语言的函数malloc和free  (1) 函数malloc和free在头文件<stdlib.h>中的原型及参数        void * malloc(size_t size) 动态配置内存,大小有size决定,返回值成功时为任意类型指针,失败时为NULL.        void  free(void *ptr) 释放动态申请的内存空间,调用free()后ptr所指向的内存空间被收回,如果ptr指向未知地方或者指向的空间已被收回,则会发生不可预知的错误,如果ptr为NULL,

(一四二)继承和动态内存分配

当基类.派生类用,或者不用动态内存时,共有四种情况: (注意,前提是基类的动态内存分配相关函数符合常规使用动态内存的要求)   情况一:基类 使用 动态内存分配.派生类新增数据成员 不使用 动态内存分配 假如基类使用动态内存分配(new),其必然设定①构造函数.②复制构造函数.③赋值运算符.④析构函数. 又知,派生类的构造函数(包括默认构造函数),需要调用基类的构造函数. 那么基类的数据成员若使new,则已经没问题. 派生类新增的数据成员,由于不使用new,因此可以按值传递.   ①对于派生类构

c语言-C语言内存分配malloc导致的程序退出

问题描述 C语言内存分配malloc导致的程序退出 char *p; while (1) { p = malloc(1); *p = 0; } 这样写最后是因为没有内存退出还是向0写入退出?怎么感觉是内存完了 解决方案 内存分配失败就会返回空指针 解决方案二: 堆内存被使用完后,在申请就睡失败,p就是NULL,即地址为0写入,而这个地址是受程序保护的,无法写入因此退出 解决方案三: 个人觉得你这个应该是会导致堆内存不够,导致程序异常退出

C++语言之动态内存分配

在C语言中,我们熟悉的内存分配与释放的最常用的接口分别是malloc , free .在C++中:     存在着更加方便的动态存储分配: 1.new 和delete 机制,new 它能更可靠控制存储区的分配,C++ 用delete 释放new 运算符申请的存储区. 2.new 分配空间时, 如果是对象, 自动调用构造函数. 3.new [] 表示分配一个动态数组, 要跟delete [] 配合使用. 直接上代码: #include <iostream> using namespace std

Linux下C编程:浅谈动态内存

使用动态内存时需要用户自己去申请资源和释放资源.用户可以随时的分配所需空间,根据需要分配空间大小,并在最后释放申请内存. 动态内存也存在隐患:在大型的项目当中管理申请的动态内存是很复杂的,以及释放申请的内存有难想起的.在释放动态内存时可能不止一个指针指向了该内存,所以释放的时候是很容易出错的.内存无法释放就会造成内存泄露,这也就是为什么服务器要经常的每个一段时间重启的原因. 内存管理操作: 分配内存函数: #include <stdlib.h> void *malloc(size_t size