《程序员自我修养》阅读笔记

来源:互联网 发布:windows重启网络命令 编辑:程序博客网 时间:2024/06/05 13:32

1,gcc hello.c所包含的过程:

预处理,编译,汇编,链接。

其中预处理主要是对程序代码进行展开,精简。

编译把预处理之后的文件进行一系列的词法分析,语法分析,语义分析,中间代码生成,以及目标代码生成和优化产生汇编代码。

汇编把汇编代码转成机器代码。

链接:将代码的不同部分进行组装,主要包括:地址和空间分配,符号绑定,重定位。

对于编译之后生成的目标文件里面主要包含以下几段:

代码段,(.code):存放机器代码。

数据段,(.data):存放已经初始化的全局变量和局部静态变量。

bss段,(.bss):存放未初始化的全局变量和局部静态变量。

2,程序的执行:

每一个函数在执行main函数之前,会首先执行.init段,执行main函数之后在退出前会执行.fini段,c++代码的构造和析构函数就是依据这一原理,将相应函数置于其中,进行的。

3,静态、动态链接库

静态链接方法:#pragmacomment(lib, "test.lib"),静态链接的时候,载入代码就会把程序会用到的动态代码或动态代码的地址确定下来

静态库的链接可以使用静态链接,动态链接库也可以使用这种方法链接导入库

动态链接方法:LoadLibrary()/GetProcessAddress()FreeLibrary(),使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码的逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间的性能比不上静态链接的程序。

具体细节可以参看链接:

http://www.cnblogs.com/kex1n/archive/2011/09/06/2168435.html



0 0