动态内存分配PK栈区分配(性能还是灵活性)

       为什么要申请动态内存分配使用权的问题:我想自己以前是根本没有任何的经验的。我的程序中几乎没有在堆中申请动态内存,全部都是在栈区中建立数组,但是数组的长度是有限的,根据测试表明,数组的存储的容量大概是400KB,所以在实现加解密程序的时候,仅仅是为了达到要求,并没有使用动态分配的技术。假设一个整型变量存储一个汉字的话,能够存储的字符个数大概是10万个汉字,那么动态分配的存储个数更是庞大。我的程序应该尝试使用并且懂得如何释放。

int* number=new int [100000000],可以申请10的8次方个整型的变量存储空间

int number[100000],可以申请20的5次方个整型的变量存储空间

在数量是两者之间的差距是非常大的,但是我们需要消耗CPU分配内存的开销为前提条件:

以下是两者在时间上的比较:

#include<iostream>
#include<string.h>
#include<time.h>
using namespace std;
int main()
{
 //声明测试程序开始时间和结束时间的变量
 clock_t start,finish1,finish2;
 start=clock();
 //定义5000个指向字符串的指针
 string* pstr[5000];
 //在堆区申请内存,存储字符串变量
 for(int i=0;i<5000;i++)
 {
  pstr[i]=new string;
 }
 finish1=clock();
 for(i=0;i<5000;i++)
 { 
 *pstr[i]="aaa";
 } //销毁指针,回收堆区的内存,以便下次使用
 for( i=0;i<5000;i++)
 {
  //下面的两种操作方式,到底哪一种是正确的
  //delete[] pstr[i]; //Error
  delete pstr[i];
 }
 finish2=clock();
 cout<<finish1-start<<endl;
 cout<<finish2-finish1<<endl;
 return 0;
}
//测试结果表明:系统消耗3毫秒创建堆区对象,19毫秒销毁堆区对象
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include<iostream>
#include<string.h>
#include<time.h>
using namespace std;
int main()
{
 //声明测试程序开始时间和结束时间的变量
 clock_t start,finish1;
 start=clock();

 //在栈区申请内存,存储字符串变量
 for(int i=0;i<5000;i++)
 {
  string s="aaaa";
 }
 finish1=clock();
 cout<<finish1-start<<endl;
  return 0;
}
//测试结果表明:系统消耗10毫秒时间创建栈区对象的元素,与此同时,还已经包含销毁这些对象的时间
时间: 2024-11-10 08:27:07

动态内存分配PK栈区分配(性能还是灵活性)的相关文章

Linux-(C/C++)动态内存分配malloc以及相关学习

1.C/C++内存分类(引用C++ Primer )(对象在C语言中可以理解为变量) 1.1.静态内存:静态内存用来保存局部static对象.类static数据成员.以及定义在任何函数之外的变量 1.2.栈内存:栈内存用来保存定义在函数内非static对象.(当然包含函数参数开辟的内存) 1.3.动态内存:每个程序还有一个内存池,这部分内存被称作自由空间(free store)或者堆(heap).程序用堆来存储动态分配的内存(dynamically allocate)的对象,也就是,那些在程序运

4、动态内存分配(*****)

一.传统数组的缺点(*****) 1).数组长度必须事先制定,且只能是常整数,不能是变量 例子: int a[5]://oK int len=5:int a[len]://error 2).传统形式定义的数组,该数组的内存程序员无法手动释放,在一个函数运行期间,系统为该函数中数组所分配的空间会一直存在,直到该函数运行完毕时,数组的空间才会被系统释放 3).数组的长度一旦定义,其长度就不能在更改数组的长度不能在函数运行的过程中动态的扩充或缩小 4).A函数定义的数组,在A函数运行期间可以被其它函数

内存分配原理 -进程分配内存的两种方式,分别有系统调用完成brk() 和mmap()(不设计共享内存)

如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误.           这两个数值表示一个进程自启动以来所发生的缺页中断的次数. 发成缺页中断后,执行了那些操作? 当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 1.检查要访问的虚拟地址是否合法 2.查找/分配一个物理页 3.填充物理页内容(读取磁盘,或者直接置0

正确使用动态内存

正确使用动态内存 一.   常见错误与预防 1.     分配后忘记释放内存 void func(void) { p = malloc(len); do_something(p); return;  /*错误!退出程序时没有释放内存*/ } 预防:编写代码时malloc()和free()保证成对出现,避免忘记资源回收. int func(void) { p = malloc(len); if (condition) return -1;  /*错误!退出程序时没有释放内存*/ free(p);

Win2012R2 Hyper-V初级教程06 &mdash; 动态内存调整

动态内存是一种新 Hyper-V 功能,可帮助您更有效地使用物理内存.使用动态内存,Hyper-V 将内存视为一种可在运行的虚拟机之间自动重新分配的共享资源.动态内存基于内存需求的变化和您指定的值,调整可供虚拟机使用的内存量. 动态内存可帮助您更有效地使用内存资源.在引入此功能之前,要更改可供虚拟机使用的内存量,只能在关闭虚拟机时完成.使用动态内存,Hyper-V 可依据在虚拟机内运行的工作负载或应用程序所需的内存量的变化,动态地为虚拟机提供更多或更少的内存.因此,Hyper-V 能够在配置了动

第12章 动态内存

全局对象:启动时分配,结束时销毁 局部对象:程序块内分配,程序块外销毁 static对象:第一次使用分配,结束时销毁 动态内存使用new来分配对象,使用delete销毁对象 12.1两种智能指针 #include<memory> shared_ptr: 多个指针可以指向同一个对象 unique_ptr: 独占指向的对象 weak_ptr: 一个伴随类,指向shared_ptr管理的对象,是弱引用 智能指针也是模板,定义时需要指明类型 shared_ptr<string> p1; s

《C++primer(第五版)》学习之路-第十二章:动态内存

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 12.1 动态内存与智能指针 1.在C++中,动态内存的管理是通过一对运算符来完成:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象进行初始化:delete,接受一个动态对象的指针,销毁该对象,并释放与之关联的内存. 2. shared_ptr允许多个指针指向同一个对象:unique_ptr则"独占"所指向的对象.标准库还定义了一个名为weak_pt

FreeRTOS 动态内存管理

本章节为大家讲解 FreeRTOS 动态内存管理,动态内存管理是 FreeRTOS 非常重要的一项功能,前面章节讲解的任务创建. 信号量. 消息队列. 事件标志组. 互斥信号量. 软件定时器组等需要的 RAM 空间都是通过动态内存管理从 FreeRTOSConfig.h 文件定义的 heap 空间中申请的. 动态内存管理介绍FreeRTOS 支持 5 种动态内存管理方案,分别通过文件 heap_1,heap_2,heap_3,heap_4 和 heap_5实现,这 5 个文件在 FreeRTOS

第十二章、动态内存

一.动态内存与智能指针 1.new:在动态内存中为对象分配空间并返回一个指向该对象的指针:delete:接受一个动态对象的指针,销毁该对象,并释放与之关联的内存 2.两种指针:shared_ptr和unique_ptr:还有一个weak_ptr:都定义在memory中 二.shared_ptr类:智能指针也是模板,需要提供指向的类型 1.一个条件判断中使用智能指针,效果就是检测它是否为空 2.最安全的分配和使用动态内存的方法是调用make_shared的标准库函数 返回指向此对象的shared_