C++底层分析

文章目录

  • 进程的地址空间划分
    • 用户空间
    • 内核空间
  • 程序的链接原理


进程的地址空间划分

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

用户空间

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文件+静态库文件
C++底层分析_第2张图片

你可能感兴趣的:(c++)