C/C++内存结构
2018-03-19 18:57
246 查看
转载自http://blog.csdn.net/ufolr/article/details/52833736
并借用部分http://blog.csdn.net/androidxiaogang/article/details/50383516博客内容
静态分配内存:是在程序编译和链接时就确定好的内存。
动态分配内存:是在程序加载、调入、执行的时候分配/回收的内存。
这块内存是共享的,当有多个相同进程(Process)存在时,共用同一个text段。
.data: 也有的地方叫GVAR(global value),用来存放程序中已经初始化的非零全局变量。静态分配。
data又可分为读写(RW)区域和只读(RO)区域。
-> RO段保存常量所以也被称为
-> RW段则是普通非常全局变量,静态变量就在其中
.bss: 存放程序中未初始化的和零值全局变量。静态分配,在程序开始时通常会被清零。
其中.bss和.data合称为数据段
text和data段都在可执行文件中,由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。
这三段内存就组成了我们编写的程序的本体,但是一个程序运行起来,还需要更多的数据和数据间的交互,否则这个程序就是死的,无用的。所以我们还需要为更多的数据和数据交互提供一块内存——堆栈。
Heap: 堆,自由申请的空间,按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。 动态分配的内存在调用malloc()或者相关函数产生,在调用free()时释放,由程序员而不是一系列固定的规则内存持续时间,因此内存块可在一个函数中创建,在另一个函数中释放。由于这点,动态内存分配所使用的部分可能就碎片,也就是说:在活动的内存块之间散布着未使用的内存片。动态分配内存往往要比栈分配的内存慢。
每个线程都会有自己的栈,但是堆空间是共用的。
内存分为系统内存与用户内存,用户内存又分了四个部分。
其中系统内存:主要运行操作系统 ,用户内存如图所示与全文讲解。
Tips:
我们可以看到:text、data(gvar)、bss 在内存中地址较低低的位置(low level address),而堆栈则在相对较搞的位置。
堆(Heap)往高地址方向生长,栈(Stack)往低地址方向生长。
并借用部分http://blog.csdn.net/androidxiaogang/article/details/50383516博客内容
动&静
一个程序被加载到内存中,这块内存首先就存在两种属性:静态分配内存和动态分配内存。静态分配内存:是在程序编译和链接时就确定好的内存。
动态分配内存:是在程序加载、调入、执行的时候分配/回收的内存。
Text & Data & Bss(代码段、初始化数据、未初始化数据)
.text: 也称为代码段(Code),用来存放程序执行代码,同时也可能会包含一些常量(如一些字符串常量等)。该段内存为静态分配,只读(某些架构可能允许修改)。这块内存是共享的,当有多个相同进程(Process)存在时,共用同一个text段。
.data: 也有的地方叫GVAR(global value),用来存放程序中已经初始化的非零全局变量。静态分配。
data又可分为读写(RW)区域和只读(RO)区域。
-> RO段保存常量所以也被称为
.constdataeg const数据
-> RW段则是普通非常全局变量,静态变量就在其中
.bss: 存放程序中未初始化的和零值全局变量。静态分配,在程序开始时通常会被清零。
其中.bss和.data合称为数据段
text和data段都在可执行文件中,由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。
这三段内存就组成了我们编写的程序的本体,但是一个程序运行起来,还需要更多的数据和数据间的交互,否则这个程序就是死的,无用的。所以我们还需要为更多的数据和数据交互提供一块内存——堆栈。
堆栈(Heap& Stack)
堆和栈都是动态分配内存,两者空间大小都是可变的。Stack: 栈,存放Automatic Variables,按内存地址由高到低方向生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。保存程序中的局部变量(也就是在代码块中的变量)这样的变量伴随着函数的调用和终止,在内存中也相应的增加或者减少。这样的变量在创建时期按顺序加入,在消亡的时候按相反的顺序移除。Heap: 堆,自由申请的空间,按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。 动态分配的内存在调用malloc()或者相关函数产生,在调用free()时释放,由程序员而不是一系列固定的规则内存持续时间,因此内存块可在一个函数中创建,在另一个函数中释放。由于这点,动态内存分配所使用的部分可能就碎片,也就是说:在活动的内存块之间散布着未使用的内存片。动态分配内存往往要比栈分配的内存慢。
每个线程都会有自己的栈,但是堆空间是共用的。
内存分为系统内存与用户内存,用户内存又分了四个部分。
其中系统内存:主要运行操作系统 ,用户内存如图所示与全文讲解。
Tips:
char* p = new char[20]; // 这行代码在Heap中开辟了20个char长度的空间,同时在Stack上压入了p, // 指针变量p存在于栈上,其值为刚刚在堆上开辟的空间的首地址。
图解
在 sw-at 这张图中所示内存空间,地址由下往上增长,分别标示了 .text、.data、.bss、stack和heap的内存分部情况。我们可以看到:text、data(gvar)、bss 在内存中地址较低低的位置(low level address),而堆栈则在相对较搞的位置。
堆(Heap)往高地址方向生长,栈(Stack)往低地址方向生长。
相关文章推荐
- c++对象多继承的内存结构
- C/C++ 内存分配里的 堆和栈 与数据结构里的 堆和栈
- c++ 对象模型与内存结构
- C++ 根据vector 容器内存放的自定义结构的某个元素 进行升序降序排序
- c++面试题之 多继承内存结构
- c++单继承、多继承、菱形继承的内存布局(虚函数表结构)
- 怎么看C++对象的内存结构 和 怎么解密C++的name mangling
- C/c++语言中 float double在内存中的存储结构详解
- C++ class实例的内存结构
- c和c++中的内存结构的
- c++指针和内存结构总结
- C++ 应用程序 内存结构 --- BSS段,数据段,代码段,堆内存和栈
- C/C++程序在运行时的内存结构
- C++ 内存结构大小
- C++反汇编第五讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式.
- 20140228:C++对象内存结构之虚函数
- 64位和32位平台下C/C++结构内存对齐
- 使用CL.EXE查看C++中类的内存结构
- C/C++中关于地址、指针和引用变量的学习笔记(九) : 内存结构
- C++对象的内存结构