c++编译链接运行(一)

1、C和C++写代码必须通过编译、链接,才能得到可执行程序,可执行文件本身在磁盘存着,若要运行它,必须把它加载到内存。因为cpu从内存访问数据的效率远远大于从磁盘访问数据的效率。

2、那么要加载到内存,都要加载哪些东西呢?

      无论那种语言写代码都只产生指令和数据。

3、把数据和指令加载到内存后如何区分二者呢?

     一个计算机系统有CPU、内存、I/O,操作系统为了屏蔽底层硬件的差异,使应用层的用户使用统一的接口去编写策划程序,给我们提供了很多抽象技术。

      进程、虚拟内存、虚拟文件系统是操作系统内核的重要部分。

      系统内核屏蔽了底层硬件,只要有操作系统在,所写的代码生成的可执行文件不可能直接被加载到物理内存上,那被加载到哪了呢?

4、虚拟内存

     虚拟内存的大小与操作系统的位数有关(CPU位数),那么CPU位数又与什么有关呢?

    基于X86的32位Linux内核,CPU的位数有32位。CPU主要是运算数据的,它的位数代表它一次能计算的最长整数的宽度,CPU在ALU算术逻辑单元中运算。也就是说CPU的位数就是ALU算术逻辑单元的宽度,数据总线的条数怎么来呢?对于32位来说数据总线和地址总线都是32,但是不是所有CPU位数的数据总线和地址总线条数相等。16位CPU的数据总线16条,地址总线20条;8位CPU的数据总线8条,地址总线16条;所以CPU并不是地址总线的条数。

5、虚拟内存和CPU位数有关,所以32位CPU的大小为4G,2^32=4G。一个程序一运行不会直接去物理内存,而是会先得到一块4G的虚拟地址空间。那这4G的布局是怎样的呢?

6、数据段分为.data和.bss,数据初始化了的或者不为0的放在.data中;无初始化或者为0的放在.bss中。

7、程序运行起来还没有堆,当运行到malloc/new时才会有堆,但堆的内存已经预留好了;程序运行起来必须有.text、.data、.bss、栈;

     为什么有栈呢?因为程序运行以后要进入第一个函数,函数的运行必须提供栈上的内存。

8、局部变量属于指令,全局变量、静态全局变量、静态局部变量属于数据。

    

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值