
程序员的自我修养(摘)
-小蛙-
这个作者很懒,什么都没留下…
展开
-
程序员的自我修养——编译和链接
预编译:主要处理那些源代码文件中的以 “#” 开始的预编译指令。如 #include、#pragma、#define。$ gcc -E client.cpp -o client.i 或 $ cpp client.cpp > client.i 编译:整个程序构建的核心部分,也是最复杂的部分。把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生成相应的汇编文件。原创 2016-03-19 23:05:35 · 431 阅读 · 0 评论 -
程序员的自我修养—线程安全
Windows 多线程数据安全措施原创 2016-03-17 20:38:07 · 353 阅读 · 0 评论 -
程序员的自我修养——静态链接
ELF两个特殊的段: .init 段:保存可执行指令,构成进程的初始化代码。在main 函数之调用之前,Glibc 初始化部分安排执行这个段中的代码。 .fint 段:保存进程终止代码指令。main函数正常退出时,Glibc 会安排执行这个段中的代码。ABI(应用二进制接口):符号修饰标准、变量内存布局、函数调用方 式等这些跟可执行代码二进制兼容性相关的内容。lds扩展名:链接脚本名。原创 2016-03-20 22:30:04 · 286 阅读 · 0 评论 -
程序员的自我修养——目标文件
目标文件内容1. “文件头”:描述整个文件的文件的文件属性,包括文件是否可执 行、是静态链接还是动态链接及入口地址(可执行文件)、目标硬件、目标操作系统等信息,文件头还包括一个段表。段表其实就是一个描述文件中各个段的数组,描述段在文件中的偏移位置及段的属性等。 2. .text段:编译后执行语句都编译成机器代码,保存在该段。 3. .data段:已经初始化的全局变量和局部静态变量都保存原创 2016-03-20 17:56:22 · 317 阅读 · 0 评论 -
程序员的自我修养——装载与进程
一般来说,C语言指针大小的位数与虚拟空间的位数相同。32位平台下的指针为32位,即4字节;64位平台下的指针为64位,即8字节。动态装入的基本原理:程序运行时是有局部性原理的,可以将程序最常用的部分驻留在内存中,而将一些不太常用的数据存放在磁盘里面。在有虚拟存储情况下,进程建立最开始三件事: 1. 创建一个独立的虚拟地址空间。 2. 读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系。原创 2016-03-23 00:13:31 · 268 阅读 · 0 评论 -
程序员的自我修养——动态链接
静态库的问题空间浪费。对程序的更新、部署和发布会带啦很多麻烦。如果某一个模块更新,则需要重新链接所有的文件。为了解决这两个问题,把程序的模块分隔开来形成独立文件,把链接这一过程推迟到运行时在进行——动态链接的基本思想。动态链接的基本思想动态链接的基本思想:把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序,而不是像静态链接那样把所有的程序模块都链接成一个单独原创 2016-03-23 00:09:11 · 466 阅读 · 0 评论 -
程序员的自我修养——Windows下的动态链接
DLL显示运行时链接LoadLibrary,装载一个DLL到进程的地址空间。GetProcAddress,查找某个符号的地址。FreeLibrary,卸载某个已加载的模块。在Windows下,要尽量遵循以下指导意见来使用C++编写动态链接库所有的接口函数都应该是虚函数。所有的方法都应该是纯虚的(或inline)。所有的全局函数都应该使用extern “C” 来防止名字修饰的不兼容。并且导原创 2016-03-23 23:36:24 · 220 阅读 · 0 评论 -
程序员的自我修养——内存
栈函数 和 局部变量 都要使用到栈。 在经典的操作系统中,栈总是向下增长的。压栈操作使栈顶的地址减小,弹出的操作使栈顶地址增大。堆栈帧保存了一个函数调用所需要的维护信息的栈。也称为活动记录。 一般包含以下方面: 1. 函数返回地址和参数; 2. 临时变量:函数的非静态局部变量、编译器自动产生的其他临时变量。 3. 保存的上下文:函数调用前后需要保持不变的寄存器。Debug模式在第四步里原创 2016-03-23 23:58:47 · 324 阅读 · 0 评论 -
程序员的自我修养——运行库
atexit()函数注册一个main结束时执行的函数。一个典型的程序运行步骤大致如下: 1. 操作系统在创建进程后,把控制权交给程序的入口; 2. 入口函数对运行库和程序运行环境进行初始化,包括堆、IO、线程、全局变量构造等。 3. 入口函数在完成初始化之后调用main函数,开始执行程序主体部分。 4. main函数执行完毕之后,返回到入口函数,入口函数进行清理工作,包括全局变量析构、堆销毁原创 2016-03-24 00:27:31 · 388 阅读 · 0 评论