参考百度百科(与以往认知有偏差)
C/C++程序的内存分区(Memory Partition),可划分为四大内存分区:堆、栈、全局/静态存储区和代码区。
堆区
由编程人员手动申请,手动释放,若不手动释放,程序结束后由系统回收,生命周期是整个程序运行期间。使用malloc或者new进行堆的申请,堆的总大小为机器的虚拟内存的大小。(ps-self view: 由malloc申请的叫做堆区,new申请的叫做自由存储区)。
栈区
由系统进行内存的管理。主要存放函数的参数以及局部变量。在函数完成执行,系统自行释放栈区内存,不需要用户管理。整个程序的栈区的大小可以再编译器中由用户自行设定,VS中默认的栈区大小为1M,可通过VS手动更改栈的大小。64bits的Linux默认栈大小维10MB,可通过ulimit -s临时修改。
全局/静态存储区
全局/静态区内的变量在程序编译阶段已经分配好内存空间并初始化。这块内存在程序的整个运行期间都存在,他主要存放静态变量、全局变量和常量。(常量什么时候存在全局/静态区了?)
注意:
1.这里不区分初始化和未初始化的数据区,是因为静态存储区内的变量若不显示初始化,则编译器会自动以默认的方式进行初始化,即静态存储区内不存在未初始化的变量。
2. 静态存储区内的常量分为常变量和字符串常量,一经初始化,不可修改。静态存储内的常变量是全局变量,与局部常变量不同,区别在于局部常变量存放于栈,实际可间接通过指针或者引用进行修改,而全局常变量存放于静态常量区则不可以间接修改。(这里有疑问,如何修改)
3. 字符串常量存储在全局/静态存储区的常量区,字符串常量的名称即为它本身,属于常变量。
代码区
存放程序体的二进制代码。比如所写的函数,都是在代码区。
const int d=1;//栈区
static const int d;//静态常量区
总结
数据区包括:堆,栈,全局/静态存储区。
全局/静态存储区:常量区(静态常量区),全局区(全局变量区),静态变量区(静态区)。
常量区:字符串常量区和常变量区。
代码区:存放程序编译后的二进制代码,不可寻址区。