c/c++内存分布
创始人
2025-05-29 11:24:30
0

C++内存分为5个区域:

  1. 堆 heap :
    由new分配的内存块,其释放编译器不去管,由我们程序自己控制(一个new对应一个delete)。如果程序员没有释放掉,在程序结束时OS会自动回收。涉及的问题:“缓冲区溢出”、“内存泄露”

  1. 栈 stack :
    是那些编译器在需要时分配,在不需要时自动清除的存储区。存放局部变量、函数参数。
    存放在栈中的数据只在当前函数及下一层函数中有效,一旦函数返回了,这些数据也就自动释放了。

  1. 全局/静态存储区 (.bss段和.data段) :
    全局和静态变量被分配到同一块内存中。未初始化的放在.bss段中,初始化的放在.data段中

  1. 常量存储区 (.rodata段) :
    存放常量,不允许修改(通过非正当手段也可以修改)

  1. 代码区 (.text段) :
    存放代码(如函数),不允许修改(类似常量存储区),但可以执行(不同于常量存储区)

在linux系统中,程序在内存中的分布如下所示:

  低地址

  .text---> .data --->.bss

  --->heap(堆) --> unused <-- stack(栈)

  -->env

  高地址

其中 :

  • .text 部分是编译后程序的主体,也就是程序的机器指令。

  • .data 和 .bss 保存了程序的全局变量,.data保存有初始化的全局变量,.bss保存只有声明没有初始化的全局变量。

  • heap(堆)中保存程序中动态分配的内存,比如C的malloc申请的内存,或者C++中new申请的内存。堆向高地址方向增长。

  • stack(栈)用来进行函数调用,保存函数参数,临时变量,返回地址等。

使用nm命令进行查看,发现有个有趣的现象,声明的静态成员变量,如果初始化为默认值,如int为0,则被放在bss段,在编译器看来,该变量未被初始化。

测试代码如下:

static int test_0;
static int test_1 = 1;int test_2;
int test_3 = 1;int main() {int test_4;test_4 = 2;static int test_5 = 1; // datastatic int test_6 = 0; // bssreturn 0;
}
// nm a.out -f sysv
/**Symbols from a.out:Name                  Value           Class        Type         Size             Line  Section__bss_start         |000000000020101c|   B  |            NOTYPE|                |     |.bss
completed.7698      |000000000020101c|   b  |            OBJECT|0000000000000001|     |.bss
__cxa_finalize@@GLIBC_2.2.5|                |   w  |              FUNC|                |     |*UND*
__data_start        |0000000000201000|   D  |            NOTYPE|                |     |.data
data_start          |0000000000201000|   W  |            NOTYPE|                |     |.data
deregister_tm_clones|0000000000000520|   t  |              FUNC|                |     |.text
__do_global_dtors_aux|00000000000005b0|   t  |              FUNC|                |     |.text
__do_global_dtors_aux_fini_array_entry|0000000000200df8|   t  |            OBJECT|                |     |.fini_array
__dso_handle        |0000000000201008|   D  |            OBJECT|                |     |.data
_DYNAMIC            |0000000000200e00|   d  |            OBJECT|                |     |.dynamic
_edata              |000000000020101c|   D  |            NOTYPE|                |     |.data
_end                |0000000000201030|   B  |            NOTYPE|                |     |.bss
_fini               |0000000000000684|   T  |              FUNC|                |     |.fini
frame_dummy         |00000000000005f0|   t  |              FUNC|                |     |.text
__frame_dummy_init_array_entry|0000000000200df0|   t  |            OBJECT|                |     |.init_array
__FRAME_END__       |00000000000007d4|   r  |            OBJECT|                |     |.eh_frame
_GLOBAL_OFFSET_TABLE_|0000000000200fc0|   d  |            OBJECT|                |     |.got
__gmon_start__      |                |   w  |            NOTYPE|                |     |*UND*
__GNU_EH_FRAME_HDR  |0000000000000694|   r  |            NOTYPE|                |     |.eh_frame_hdr
_init               |00000000000004b8|   T  |              FUNC|                |     |.init
__init_array_end    |0000000000200df8|   t  |            NOTYPE|                |     |.init_array
__init_array_start  |0000000000200df0|   t  |            NOTYPE|                |     |.init_array
_IO_stdin_used      |0000000000000690|   R  |            OBJECT|0000000000000004|     |.rodata
_ITM_deregisterTMCloneTable|                |   w  |            NOTYPE|                |     |*UND*
_ITM_registerTMCloneTable|                |   w  |            NOTYPE|                |     |*UND*
__libc_csu_fini     |0000000000000680|   T  |              FUNC|0000000000000002|     |.text
__libc_csu_init     |0000000000000610|   T  |              FUNC|0000000000000065|     |.text
__libc_start_main@@GLIBC_2.2.5|                |   U  |              FUNC|                |     |*UND*
main                |00000000000005fa|   T  |              FUNC|0000000000000012|     |.text
register_tm_clones  |0000000000000560|   t  |              FUNC|                |     |.text
_start              |00000000000004f0|   T  |              FUNC|000000000000002b|     |.text
test_2              |0000000000201020|   B  |            OBJECT|0000000000000004|     |.bss
test_3              |0000000000201014|   D  |            OBJECT|0000000000000004|     |.data
__TMC_END__         |0000000000201020|   D  |            OBJECT|                |     |.data
_ZL6test_0          |0000000000201024|   b  |            OBJECT|0000000000000004|     |.bss
_ZL6test_1          |0000000000201010|   d  |            OBJECT|0000000000000004|     |.data
_ZZ4mainE6test_5    |0000000000201018|   d  |            OBJECT|0000000000000004|     |.data
_ZZ4mainE6test_6    |0000000000201028|   b  |            OBJECT|0000000000000004|     |.bss
*/

相关内容

热门资讯

山西太钢不锈钢股份有限公司 2... 来源:证券日报 证券代码:000825 证券简称:太钢不锈 公告编号:2026-001 本公司及董...
把自己的银行贷款出借给别人,有... 新京报讯(记者张静姝 通讯员邸越洋)因贷款出借后未被归还,原告牛女士将被告杨甲、杨乙诉至法院,要求二...
金价暴跌,刚买的金饰能退吗?有... 黄金价格大跌,多品牌设置退货手续费。 在过去两三天,现货黄金价格经历了“过山车”般的行情,受金价下跌...
预计赚超2500万!“豆腐大王... 图片来源:图虫创意 在经历了一年亏损后,“豆腐大王”祖名股份(003030.SZ)成功实现扭亏为盈。...
特朗普提名“自己人”沃什执掌美... 据新华社报道,当地时间1月30日,美国总统特朗普通过社交媒体宣布,提名美国联邦储备委员会前理事凯文·...
爱芯元智将上市:连年大额亏损,... 撰稿|多客 来源|贝多商业&贝多财经 1月30日,爱芯元智半导体股份有限公司(下称“爱芯元智”,HK...
一夜之间,10只A股拉响警报:... 【导读】深康佳A等10家公司昨夜拉响退市警报 中国基金报记者 夏天 1月30日晚间,A股市场迎来一波...
谁在操控淳厚基金?左季庆为谁趟... 2026年1月6日,证监会一纸批复核准上海长宁国有资产经营投资有限公司(下称“长宁国资”)成为淳厚基...
工商银行党委副书记、行长刘珺会... 人民财讯1月31日电,1月29日,工商银行党委副书记、行长刘珺会见来访的上海电气集团党委书记、董事长...
布米普特拉北京投资基金管理有限... 从亚马逊到联合包裹,一场席卷美国企业的“瘦身”行动正在持续。多家企业近期承认,近年来的扩张步伐迈得过...
酒价内参1月31日价格发布 飞... 来源:酒业内参 新浪财经“酒价内参”过去24小时收集的数据显示,中国白酒市场十大单品的终端零售均价在...
筹码集中的绩优滞涨热门赛道股出... 2025年以来,在受多重因素的刺激下,科技、航天、基础化工等热门赛道中走出轮番上涨的结构性行情,其中...
2026年A股上市公司退市潮开... 来源:界面新闻 界面新闻记者 赵阳戈 随着2026年序幕拉开,A股市场新一轮“出清”即将上演。...
雷军官宣新直播:走进小米汽车工... 【太平洋科技快讯】1 月 31 日消息,小米创办人、董事长兼 CEO 雷军在社交媒体发文宣布,将于 ...
现货黄金直线跳水,跌破5200... 新闻荐读 1月29日晚,现货黄金白银快速走低,回吐盘中全部涨幅。23:15左右,现货黄金跌破5300...
加拿大拟与多国联合设立国防银行 新华社北京1月31日电 加拿大财政部长商鹏飞1月30日说,加拿大将在未来数月与国际伙伴密切合作,推进...
马斯克大消息!SpaceX申请... 据券商中国,美东时间1月30日,路透社报道,据两位知情人士透露,马斯克旗下SpaceX公司2025年...
澳网:雷巴金娜2-1萨巴伦卡女... 北京时间1月31日,2026赛季网球大满贯澳大利亚公开赛继续进行,在女单决赛中,5号种子雷巴金娜6-...
春节前白酒促销热:“扫码抽黄金... 春节临近,白酒市场再现价格异动。 近日,飞天茅台批价拉升,有酒商直言“年前要冲2000元关口”,引发...