以下内容来自《C++编程实战宝典》
变量和函数占用的内存是系统在程序运行时为程序分配的,但并不是所有的变量和函数都被分配在同一块内存区域中。对于一个C++程序来说,系统一般采用3种方式为程序分配内存,下面将分别介绍这3种方式。
(1)从静态存储区域分配
这部分内存在程序编译的时候就已经分配好,并且这块内存在程序的整个运行期间都存在。例如在函数外定义的全局变量,以及在创建时使用static修饰符的变量。在该区域存储的内容一般是全局变量,其中存储在数据段中的全局变量通常已经被初始化。
(2)在栈上进行内存分配
这部分区域被称为堆栈,但这只是一种习惯性说法,并不是堆和栈的统称。该部分存储的变量一般是在函数体中定义的局部变量(不包括static声明的变量,static意味着变量存放在数据段中),除此之外,经常在栈区出现的还有传递给函数的参数和函数的返回值等。栈区变量的生存周期是在入栈前(函数开始被调用)获得内存空间,而在出栈时(函数结束调用)释放内存空间。因此尽量不要将函数中的局部变量作为函数的返回值,因为在函数调用结束后,局部变量就不存在了,再使用此变量的值作为返回值,会使程序获取的返回值有可能为随机数。在执行函数时,函数体内的局部变量在栈上被自动创建,而在函数执行结束时,这些存储单元自动被释放。栈内存分配由操作系统完成而不需要程序员手动参与。因此其执行效率非常高。但是整个栈区可以被分配的内存容量有限。因此定义过多的未使用的局部变量会使程序执行变慢。
(3)从堆上分配
通常称为动态分配的内存,该部分内存区域的大小并不固定,当程序运行时有程序员用 malloc() 函数等内存分配函数来分配,或使用 new 操作符等系统提供的函数来分配。该内存的大小可以根据程序中的实际需要来指定。该部分内存空间不会随着函数运行的结束而被自动回收,也不会被自动释放,需要程序员自己用 free() 函数或 delete 操作符进行内存的回收。动态内存的生存期由程序员自行决定,但如果分配了空间,就必须对其回收,否则运行的程序会出现内存泄漏,并且频繁地分配和释放不同大小的堆空间将会产生堆内碎块,间接降低内存空间的使用率,严重时会产生大量内存碎片。
(内存碎片是一些分散的内存区域,大量内存碎片的存在会降低内存的使用率。)