C++:内存管理:C++内存管理详解(三):从目标文件结构、加载、执行、汇编角度来分析内存分区管理

每一个C++源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。目标文件由段组成,通常一个目标文件至少有两个段(segment);

代码段:该段中所包含的主要是程序指令,该段一般是可读可写,但一般却不写。

数据段:主要存放程序中要用到的各种全局变量或静态的数据,一般数据段都是可读、可写,可执行的。

 1:目标文件结构

  1. 目标文件是源代码编译但未链接的中间文件(windows的.obj或者Linux的 .o),Windows的.obj采用PE格式,Linux采用 ELF格式,两种格式均是基于通用目标文件格式变化而来,所以两者大致相同
  2. 目标文件一般包含编译后的机器指令代码、数据、调试信息,还有链接时所需重要的一些信息,比如重定位信息和符号表等,而且一般目标文件会将这些不同信息按照不同的属性,以“节(section)”也叫段 “segment”的形式进行存储。
// main.cpp


#include<iostream>

int gInitVar = 1;  // .data 加载阶段加载
int gUninitVar;    // .bss加载阶段加载
const int gConstVar = 2;  //.rdata加载阶段加载
// extern 可以修饰const用于扩展文件链接性,const默认是文件内链接的。
// static 修饰全局变量可以限制其文件链接性,其存储属性不变。

void foo(int i)   // .text 加载阶段加载
{     
	static int staticLocalInitVar = 3;  //.data加载阶段加载
	static int staticLocalUninitVar;    // .bss加载阶段加载
	int stack_localVar = 4;             // 栈帧(每个程序运行时会加载1-2M栈空间)
	const int LocalConstVar = 5;        // 栈帧(运行时自动分配)
	staticLocalUninitVar = LocalConstVar + gConstVar;
	gUninitVar = staticLocalInitVar + gInitVar;
	// 申请堆空间
	int* dynamic_heapData = (int*)malloc(sizeof(int) * 10000000);
	dynamic_heapData[10000000 - 1] = 9;   // 堆区(运行时动态申请)

	i += stack_localVar + staticLocalUninitVar + gUninitVar;
	printf("%d\n", i + dynamic_heapData[10000000 - 1]); // .rdata,加载阶段加载"%d\n"
	free(dynamic_heapData);             // 堆内存需要显式释放
}

int main() {
	
	foo(6);
	getchar();
	return 0;
}

参考文献:从目标文件结构,加载、执行阶段,汇编角度来理解C程序内存分区

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值