码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 笔记 ----内存管理

时间:2018-04-16 13:09:29      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:内存管理   移植   成员变量   类型   简单   分配   语言   段式内存管理   ++   

动态内存分配

代码存放在代码区,数据则根据类型的不同存放在不同的区域中。

在采用段式内存管理的架构中(比如intel的80x86系统),bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零(bss段属于静态内存分配,即程序一开始就将其清零了)。

BSS段存放没有初始化或者初始化为0的全局变量。大多数os加载程序时会把BSS全局变量清0;为了保证移植性,最好把变量初始化为0。

在C语言程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中

例子: int g_bss_array[1024 * 1024];  和 int g_bss_array[1024 * 1024] = {1};

bss.c gcc命令编译生成的可执行文件大小:初始化为1时 4.1M; 程序运行周期bss一直存在。

 

text段: 用于存放程序代码的区域, 编译时确定, 只读。更进一步讲是存放处理器的机器指令,当各个源文件单独编译之后生成目标文件,经连接器链接各个目标文件并解决各个源文件之间函数的引用,与此同时,还得将所有目标文件中的.text段合在一起,但不是简单的将它们“堆”在一起就完事,还需要处理各个段之间的函数引用问题。
在嵌入式系统中,如果处理器是带MMU(MemoryManagement Unit,内存管理单元),那么当我们的可执行程序被加载到内存以后,通常都会将.text段所在的内存空间设置为只读,以保护.text中的代码不会被意外的改写(比如在程序出错时)。当然,如果没有MMU就无法获得这种代码保护功能。

data段 :用于存放在编译阶段(而非运行时)就能确定的数据,可读可写。也是通常所说的静态存储区,赋了初值的全局变量、常量和静态变量都存放在这个域。

全局的未初始化变量存在于bss段中,具体体现为一个占位符,全局的已初始化变量存于data段中,而函数内的自动变量都在栈上分配空间。

 

bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。

data段(已手动初始化的数据)为数据分配空间,数据保存在目标文件中。

data段包含经过初始化的全局变量以及它们的值。

BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零,包含data和bss段的整个区段此时通常称为数据区。


静态成员变量在类之间共享数据,也是存放在全局静态数据区中,且只有一份copy。
例子:
输出不同对象的静态成员变量得到相同的地址,并且和全局变量的地址段相邻。
 
char *p = "Hello" char *p1 = "Hello"  p1 == p;
 
 
 
 

C++ 笔记 ----内存管理

标签:内存管理   移植   成员变量   类型   简单   分配   语言   段式内存管理   ++   

原文地址:https://www.cnblogs.com/starksqi/p/8855119.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!