概述 从总体上程序的
内存空间可分为代码区和数据区。从C++的角度来看数据区又可作如下划分:1. 自动存储区(栈):自动(局部)变量、寄存器变量(声明的寄存器变量可能在寄存器中,也可能在一般内存中。在逻辑上寄存器属于自动存储区。)、临时对象以及函数参数。2. 静态存储区:全局对象、函数中的静态变量、类中的静态数据成员、常量字符串以及 namespace 变量(比如 namespac
从总体上程序的内存空间可分为代码区和数据区。 从C++的角度来看数据区又可作如下划分: 1. 自动存储区(栈):自动(局部)变量、寄存器变量(声明的寄存器变量可能在寄存器中,也可能在一般内存中。在逻辑上寄存器属于自动存储区。)、临时对象以及函数参数。 2. 静态存储区:全局对象、函数中的静态变量、类中的静态数据成员、常量字符串以及 namespace 变量(比如 namespace abc = std;中的 abc。) 3. 自由存储区(堆):也称为动态内存。 一个可执行文件、.o、.a文件中系统规定的段有这么多 * .bss 该sectiopn保存着未初始化的数据,这些数据存在于程序内存映象中。通过定义,当程序开始运行,系统初始化那些数据为0。该section不占文件空间,正如它的section类型SHT_NOBITS指示的一样。 * .comment 该section保存着版本控制信息。 * .data and .data1 这些sections保存着初始化了的数据,那些数据存在于程序内存映象中。 * .deBUG 该section保存着为标号调试的信息。该内容是未指明的。 * .dynamic 该section保存着动态连接的信息。该section的属性将包括SHF_ALLOC位。是否需要SHF_WRITE是跟处理器有关。第二部分有更详细的信息。 * .dynstr 该section保存着动态连接时需要的字符串,一般情况下,名字字符串关联着符号表的入口。第二部分有更详细的信息。 * .dynsym 该section保存着动态符号表,如“Symbol table”的描述。第二部分有更 详细的信息。 * .fini 该section保存着可执行指令,它构成了进程的终止代码。 因此,当一个程序正常退出时,系统安排执行这个section的中的代码。 * .got 该section保存着全局的偏移量表。看第一部分的“Special Sections”和第二部分的“Global Offset table”获得更多的信息。 * .hash 该section保存着一个标号的哈希表。看第二部分的“Hash table”获得更多的信息。 * .init 该section保存着可执行指令,它构成了进程的初始化代码。 因此,当一个程序开始运行时,在main函数被调用之前(c语言称为main),系统安排执行这个section的中的代码。 * .interp 该section保存了程序的解释程序(interpreter)的路径。假如在这个section中有一个可装载的段,那么该section的属性的SHF_ALLOC位将被设置;否则,该位不会被设置。看第二部分获得更多的信息。 * .line 该section包含编辑字符的行数信息,它描述源程序与机器代码之间的对于关系。该section内容不明确的。 * .note 该section保存一些信息,使用“Note Section”(在第二部分)中提到的格式。 * .plt 该section保存着过程连接表(Procedure linkage table)。看第一部分的``Special Sections''和第二部分的“Procedure linkage table”。 * .rel<name> and .rela<name> 这些section保存着重定位的信息,看下面的``Relocation''描述。 假如文件包含了一个可装载的段,并且这个段是重定位的,那么该section的 属性将设此,一个重定位的section适用的是.text,那么该名字就为.rel.text或者是.rela.text。 * .rodata and .rodata1 这些section保存着只读数据,在进程映象中构造不可写的段。看第二部分的`Program header''获得更多的资料。 * .shstrtab 该section保存着section名称。 * .strtab 该section保存着字符串,一般地,描述名字的字符串和一个标号的入口相关 联。假如文件有一个可装载的段,并且该段包括了符号字符串表,那么section的SHF_ALLOC属性将被设置;否则不设置。 * .symtab 该section保存着一个符号表,正如在这个section里``Symbol table''的描述。假如文件有一个可装载的段,并且该段包含了符号表,那么section的SHF_ALLOC属性将被设置;否则不设置。 * .text 该section保存着程序的``text''或者说是可执行指令。 前缀是点(.)的section名是系统保留的,尽管应用程序可以用那些保留的section名。应用程序可以使用不带前缀的名字以避免和系统的 sections冲突。object文件格式可以让一个定义的section部分不出现在上面的列表中。一个object文件可以有多个同样名字的 section。 引用: 简单地说有如下结构 命令行参数和环境变量 栈 堆 未初始化数据段bss 初始数据段 正文段 C程序一直由下列部分组成: 1)正文段——cpu执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。 3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。 4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。 5)堆——动态存储分。 |-----------| | | |-----------| | 栈 | |-----------| | | | | /|/ | | | | | | /|/ | | | | |-----------| | 堆 | |-----------| | 未初始化 | |-----------| | 初始化 | |-----------| | 正文段 | |-----------| http://community.csdn.net/Expert/topic/3215/3215569.xml?temp=.3182337 low address +--------------------------------+ | _TEXT class 'CODP' | | code | +--------------------------------+-- | _DATA class 'DATA' | | initialized data | +--------------------------------+ DGROUP | _BSS class 'BSS' | | uninitialized data | +--------------------------------+-- | | | FREE SPACE | +--------------------------------+ | | | STACK | +--------------------------------+ | | | HEAP | +--------------------------------+ | | | FREE SPACE | +--------------------------------+ |
总结
以上是内存溢出为你收集整理的关于C++内存问题(转)全部内容,希望文章能够帮你解决关于C++内存问题(转)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
评论列表(0条)