基本信息
文件名称:详解C++的静态内存分配与动态内存分配.docx
文件大小:18.32 KB
总页数:6 页
更新时间:2025-06-24
总字数:约3千字
文档摘要

详解C++的静态内存分配与动态内存分配

目录I-内存分配概述1.1-定义概述1.2-分类概述1.3-区别概述II-静态内存分配III-动态内存分配IV-小结4.1-静态分配的优缺点4.2-动态分配的优缺点

I-内存分配概述

1.1-定义概述

内存分配(MemoryAllocation)是指为计算机程序或服务分配物理内存空间或虚拟内存空间的一个过程。通常在程序执行前或执行时完成内存分配。

1.2-分类概述

存在两种类型的内存分配:

编译时内存分配或静态内存分配(Compile-timeorStaticMemoryAllocation)运行时内存分配或动态内存分配(Run-timeorDynamicMemoryAllocation)

静态内存分配:

静态内存分配是由编译器为声明的变量分配内存。内存的地址可以通过地址操作符找到,并且可以赋值给指针变量。该内存是在编译时分配的。

动态内存分配:

在程序执行时(execution)或运行时(run-time)进行的内存分配被称为动态内存分配。库函数例如calloc()和malloc()或者操作符new均支持分配动态内存。动态分配的内存空间,通过这些函数或操作符的返回值分配,赋值给指针变量。

1.3-区别概述

序号静态内存分配动态内存分配1在静态内存分配中,变量被永久地分配内存,直到程序执行结束/函数调用结束在动态内存分配中,只有当你的程序单元被激活时才会为变量分配内存2静态内存分配在程序执行前完成动态内存分配在程序执行过程中完成3使用栈来管理静态分配的内存使用堆来管理动态分配的内存4较不高效(lessefficient)较高效5在静态内存分配中,不存在内存的重用在动态内存分配中,存在内存的重用,而且在不需要时可以内存可以被释放6在静态内存分配中,一旦内存被分配,内存大小就不能再改变在动态内存分配中,分配了内存后,内存的大小可以改变7在静态内存分配方案中,我们不能重新使用未使用的内存动态内存分配中,允许重复使用内存。用户可以在需要时分配更多的内存。同时,用户也可以在需要时释放内存。8在这种内存分配方案中,执行速度比动态内存分配要快在这种内存分配方案中,执行速度要比静态内存分配慢9编译时内存分配运行时内存分配10静态分配的内存从程序开始保持到程序结束动态分配的内存可以在任意时刻释放11静态的内存分配常常用于数组等动态的内存分配常常用于链表等数据结构

II-静态内存分配

内存必须被分配给我们所创建的变量,这样实际的变量才能存在。现在有一个问题,即我们认为它是如何运行的,以及它实际上是如何运行的?

计算机如何创建一个变量?

当我们思考如何创造某样东西时,我们会想到从零开始着手干,而当计算机创建一个变量X时,实际上情况并不是这样;对于计算机而言,更像是一种分配,计算机只是从许多预先存在的内存单元中分配一个内存单元给X。

那么什么是静态内存分配?当我们声明变量时,我们实际上是在准备所有会被使用的变量,这样编译器就知道被使用的变量实际上是用户想要的程序的重要部分,而不是到处漂浮的流氓符号。因此,当我们声明变量时,编译器实际做的是将这些变量分配到它们的房间(一个内存单元)。现在,可以看出,这是在程序执行前完成的,你不能在程序执行时用这种方法分配变量。

示例

voidfunc()

inta;

intmain()

intb;

intc[12];

//...

}

上述代码中所有的变量都是静态分配的。

III-动态内存分配

那么,既然已经存在一种方式来完成内存分配的工作,为什么我们需要引入另一种分配方法?为什么我们需要在程序执行过程中分配内存?

因为,尽管不是很显而易见,但不能在运行时分配内存,就降低了灵活性,并与空间效率相妥协。特别是,在那些事先不知道输入的情况下,我们会在存储的低效使用和缺乏或过多的空间用来输入数据方面受到影响(给定一个固定长度的数组或类似的数据结构来存储数据)。

所以引入动态内存分配:在运行时,存储/内存/单元可以分配给变量的机制被称为动态内存分配(不要与DMA相混淆)。因此,我们可以知道在运行期间分配内存,这使我们能够使用我们想要的存储,而不用担心任何浪费或者不足。

为什么要使用动态分配的原因

当我们事先不知道程序需要多少内存的时;当我们希望数据结构没有固定的内存空间上限时;当你想更有效地使用你的内存空间时。例如:如果你为一个一维数组分配的内存空