为什么const的变量不可以被修改?

154 阅读2分钟

我们在定义一个const的变量的时候,无法对一个const变量进行重新赋值。这是一个大家觉得自然而然的事情实际上却可以追溯的更深。

进程地址空间

我们知道每个进程都要有一个PCB的结构体来方便操作系统对进程进行管理,在PCB中有一个叫做mm_struct的东西就是进程地址空间。对于进程地址空间,这是一块虚拟的空间

image.png

页表

进程的地址空间是虚拟的,页表实际上的作用就是把虚拟地址转化为实际地址,页表储存了虚拟地址和实际内存地址的映射

image.png

结论

一个const变量储存在常量区,这个变量通过页表的映射到实际内存,而且页表中还有管理的功能,这里页表中将这个const的变量的权限设置为只读,所以const的变量就无法被修改了。

为什么存在地址空间

  1. 通过添加一层软件层,可以让进程操作内存的权限更加安全,就像上面的const的变量无法被修改一样
  2. 基于缺页中断进行内存的申请,我们在申请一段内存往往并不一定立即使用,比如我们申请了100字节空间,我又不急着用,恰好这100字节的空间被占用了呢。其实申请空间是在虚拟地址空间申请的,如果急着用页表就会从实际的空间中拿过来,如果不急着用那就不用拿,这样就很好的解决了上面的问题这样将内存申请和内存使用的概念在时间上划分清楚,通过进程地址空间来屏蔽底层申请内存的过程。