模板中的第二相汇编
2nd phase compilation in templates
我正在尝试了解C 模板Universe中的编译过程和代码生成过程。
我已经读到,在汇编的第一阶段中,仅检查基本语法(用模板代码)。并且实际代码仅适用于用于完全完成汇编的那些数据类型 - 这被称为第二阶段汇编。
-
我无法理解编译器如何知道可以调用哪种数据类型的代码以及为哪些数据类型来生成代码(因此进行第二阶段编译)。在某些情况下,函数调用(以防万一功能模板)可能不会那么棘手以在编译时间中得出数据类型,只能在用户的基于运行时输入中派生。
-
假设我使用具有许多条件的模板,基于它生成模板代码的新实例(假设一个类数据类型的新实例)。我无法测试所有数据类型的代码。因此,这是否意味着如果我对几种数据类型进行测试,那么我的代码仍然有可能出乎意料的其他数据类型失败?如果是这样,我该如何确保对所有数据类型强制第二次汇编(根据我的输入,该数据类型是实例化的)。
-
编译时间确定的类型仅依赖于静态信息。与特定类型一起使用的功能模板将为该类型生成代码,因为该选项需要在运行时可用。但是,如果可以静态地确定函数调用将永远不会发生,我认为编译器可能会忽略该实施,但是某些情况仍然会强迫。
-
您无法测试所有 datatypes,因为这是无限集。您可以创建一组所有标准类型,但是显然您无法检查所有用户定义的类型。通用代码中的想法是不取决于您允许通过的类型的细节。另外,您可能会将可能的实例集关闭到包括您制裁的类型。
我无法理解编译器如何知道可以称为模板代码的数据类型
编译器知道哪些数据类型的模板代码是实际调用的,因为它看到了程序中实际调用模板代码的每个位置。这里没有魔术。实例化发生在呼叫站点。对于实际现有调用中未使用的类型,没有进行实例化。
我的代码失败仍然有机会
对于所有基于测试的验证,模板或没有模板,甚至对于软件以外的事物而言,这都是正确的。您无法通过测试涵盖所有可能的用例。这是生活的基本事实。处理它...
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 在 emscripten 网页汇编正在运行期间更新进度条?
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 为什么 memcpy() 和其他类似的函数使用汇编?
- [[可能]]和[[不太可能]]影响程序汇编的简单示例?
- 为什么 MSVC C++编译器将一个简单的 Hello World 扩展为 4000 行汇编?
- 英特尔汇编与内部函数,AVX
- 这个x86汇编代码是如何接收和存储子程序返回的数据的
- Capstone cs_disasm仅反汇编一小部分代码
- C++和汇编中的对数
- 卤化物:X86汇编代码生成
- C++:汇编代码包含断言结果
- 在 g++4.4.7 中为复数算术生成快速汇编
- 混合 c++ 和汇编不能将多个参数从C++函数传递到程序集
- 如何使用 gcc 内联汇编器代码访问成员变量
- SSE 内联汇编和可能的 g++ 优化错误
- C++汇编代码分析(使用 clang 编译)
- 设置Qt Creator以链接和编译汇编代码
- 在Cython中使用移动方法时的汇编误差