C++底层分析

本文探讨了C++程序在进程地址空间中的布局,包括用户空间的代码段、只读数据段、已初始化数据段、BSS段、堆和栈。同时,文章也简述了程序的链接原理,涉及.o文件和静态库文件的结合过程。
摘要由CSDN通过智能技术生成


进程的地址空间划分

任何的编程语言=》产生两种东西:指令和数据
程序加载到内存中,不可能加载到物理内存。
linux系统会给当前进程分配一个2^32(32位系统,4G)大小的一块空间(进程的虚拟地址空间)
在这里插入图片描述

用户空间

1、.test : 只读
代码生成指令时,指令的内存放在代码段中(.test段)

int main()
{
	int a = 12;   // 生成一条汇编指令 mov dword ptr[a]. 0Ch
	int b = 0;
	int c;   // 这时打印他为无效值
}

所以局部变量代码经过编译后生成的是指令,放在.text段中。
在这条指令运行的时候,根据指令去栈中开辟内存。

.rodata : 只读数据段

char *p = "hello world";  // 不能修改*p
现在编译器都不让普通的指针指向常量字符串,应该这么写:
const char *p = "hello world";

其中"hello world"存放在.rodata中,因为.rodata只读,所以不能修改*p。

2、.data:存放已经初始化了的值(不为0的)

int gdata1 = 10;
static int gdata2 = 20;
```cpp
int main()
{
	int static e = 12;   // 放在.data段
	int static f = 0;   // 放在.data段
	int static g;     // 放在.bss段 这时打印他为0
}

因为static在程序启动时不会初始化,等到程序运行到static

3、.bss:给未初始化的量默认值(0)。
内核自动负责将.bss段的值全部修改为0.

int gdata1 = 0;
int gdata2;
static int gdata3 = 0;
static int gdata4;

4、.heap从上往下增长

5、动态链接库 *.dll * so

6、.stack从下往上增长

7、命令行参数和环境变量

./a.ou 192.168.1.100

内核空间

ZONE_DMA
ZONE_NORMAL
ZONE_HIGHMEN

程序的链接原理

编译完成的所有.o文件+静态库文件
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋雨qy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值