Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

编译 链接 运行期间的一些处理 #68

Open
jtmer opened this issue Jun 12, 2022 · 1 comment
Open

编译 链接 运行期间的一些处理 #68

jtmer opened this issue Jun 12, 2022 · 1 comment

Comments

@jtmer
Copy link

jtmer commented Jun 12, 2022

在学习与先前的作业中,我们遇到了一些容易弄混的在编译、链接和运行期间执行的操作,在这里总结一下:

编译器
第一遍执行语法分析和静态类型检查,将源代码解析为语法分析树的结构;第二遍由代码生成器遍历语法分析树,把树的每个节点转换为汇编语言或机器代码,生成目标模块(.o或.obj文件)
编译期:
1.关注外部函数的声明;
2.确定auto关键字的类型,因此auto a; 以及函数参数中出现auto都是不正确的
3.内联函数的生成
4.执行static_cast向下类型转换
5.对模板的处理,确定调用函数的地址。每当编译器发现对模板的一种参数的使用,就生成对应参数的一份代码。因此,模板库必须在头文件中实现,不可以分开编译

链接器
把一组目标模块链接为可执行程序,使得操作系统可以执行它;处理目标模块中的函数或变量引用,必要时搜索库文件处理所有的引用。
链接期
寻找和添加外部函数的实现(或定义);

运行期
1.使用虚函数确定调用函数的地址(基于虚函数表和虚函数指针的机制,只有指针、引用才会引起晚捆绑,否则为早捆绑,出现对象切片。注意,若某成员函数在基类中声明为虚函数,当派生类重写覆盖它时(同名,同参数函数) ,无论是否声明为虚函数,该成员函数都仍然是虚函数。)
2.dynamic_cast检查被转换的对象是否确实是正确的派生类(需要虚函数表)
3.std::function确定调用函数的地址

可见不同时期对应的过程与其相应的实现是密切相关的。

@jtmer
Copy link
Author

jtmer commented Jun 12, 2022

属于是知识点整理了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant