jtmer
jtmer
先来观察如下代码: ``` #include #include using namespace std; class Data { int x; public: Data(int _x):x(_x){ cout
在学习与先前的作业中,我们遇到了一些容易弄混的在编译、链接和运行期间执行的操作,在这里总结一下: **编译器**: 第一遍执行语法分析和静态类型检查,将源代码解析为语法分析树的结构;第二遍由代码生成器遍历语法分析树,把树的每个节点转换为汇编语言或机器代码,生成目标模块(.o或.obj文件) **编译期**: 1.关注外部函数的声明; 2.确定auto关键字的类型,因此auto a; 以及函数参数中出现auto都是不正确的 3.内联函数的生成 4.执行static_cast向下类型转换 5.对模板的处理,确定调用函数的地址。每当编译器发现对模板的一种参数的使用,就生成对应参数的一份代码。因此,模板库必须在头文件中实现,不可以分开编译 **链接器**: 把一组目标模块链接为可执行程序,使得操作系统可以执行它;处理目标模块中的函数或变量引用,必要时搜索库文件处理所有的引用。 **链接期**: 寻找和添加外部函数的实现(或定义); **运行期**: 1.使用虚函数确定调用函数的地址(基于虚函数表和虚函数指针的机制,只有指针、引用才会引起晚捆绑,否则为早捆绑,出现对象切片。注意,若某成员函数在基类中声明为虚函数,当派生类重写覆盖它时(同名,同参数函数) ,无论是否声明为虚函数,该成员函数都仍然是虚函数。) 2.dynamic_cast检查被转换的对象是否确实是正确的派生类(需要虚函数表) 3.std::function确定调用函数的地址 可见不同时期对应的过程与其相应的实现是密切相关的。
### Is there an existing issue for this bug? - [X] I have searched the existing issues ### 🐛 Describe the bug I'm downloading from source: ``` git clone https://github.com/hpcaitech/ColossalAI.git...