关于C++内存问题(转)

关于C++内存问题(转),第1张

概述  从总体上程序的内存空间可分为代码区和数据区。从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++内存问题(转)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1156400.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存