一些扫盲知识

1、编译与链接

C++编译与链接(1)-编译与链接过程
C/C++程序从编译到最终生成可执行文件的过程分析

代码需要通过以下步骤才能生成一个可执行文件:

预处理->编译->汇编->链接->可执行文件

  • 预处理器主要负责以下的几处

    1.宏的替换

    2.删除注释

    3.处理预处理指令,如#include,#ifdef
    可以通过

    g++ test.cpp -E > test.i

    命令来执行预处理,查看test.i的内容就可以看到找不到宏和注释,且宏被替换为定义好的字符串

  • 编译
    编译将进行词法分析、语法分析、语义分析和代码优化,然后生成汇编文件,可以通过

    g++ -S test.i test.s

    命令来对预处理所得到的test.i文件进行编译,查看生成的test.s文件就可以看到生成的汇编语句

  • 汇编
    汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程
    可以通过

    g++ -c test.s -o test.o

    命令来生成目标文件test.o,此时打开文件会看到乱码,因为是翻译成机器语言

  • 链接
    链接就是将上步生成的目标文件和系统库的目标文件和库文件连接起来,最终生成可以在特定平台运行的可执行文件(面试官说其实不一定是可执行文件,比如可能没有写main函数,那就不是可执行的了)。
    可以通过下面命令来生成“可执行文件”

    g++  test.o -o test.out

g++使用—-基本使用方法

2、线程与进程

进程、线程、多线程相关总结
同一进程中的线程究竟共享哪些资源
局部变量、全局变量、堆、堆栈、静态和全局

  • 线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。

  • 多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。

  • 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源(包括堆也可以共享).

  • 在很多现代操作系统中,一个进程的(虚)地址空间大小为4G,分为系统(内核?)空间和用户空间两部分,系统空间为所有进程共享,而用户空间是独立的,一般WINDOWS进程的用户空间为2G。

  • 一个进程中的所有线程共享该进程的地址空间,但它们有各自独立的(/私有的)栈(stack),Windows线程的缺省堆栈大小为1M或2M(总之是固定的,我用ulimit -a 在linux虚拟机上看到是8192k bytes)。堆(heap)的分配与栈有所不同,一般是一个进程有一个C运行时堆,这个堆为本进程中所有线程共享,windows进程还有所谓进程默认堆,用户也可以创建自己的堆。

  • 堆:是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。

  • 栈:是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是 thread safe的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值