模板中的第二相汇编

2nd phase compilation in templates

本文关键字:汇编      更新时间:2023-10-16

我正在尝试了解C 模板Universe中的编译过程和代码生成过程。

我已经读到,在汇编的第一阶段中,仅检查基本语法(用模板代码)。并且实际代码仅适用于用于完全完成汇编的那些数据类型 - 这被称为第二阶段汇编。

  1. 我无法理解编译器如何知道可以调用哪种数据类型的代码以及为哪些数据类型来生成代码(因此进行第二阶段编译)。在某些情况下,函数调用(以防万一功能模板)可能不会那么棘手以在编译时间中得出数据类型,只能在用户的基于运行时输入中派生。

  2. 假设我使用具有许多条件的模板,基于它生成模板代码的新实例(假设一个类数据类型的新实例)。我无法测试所有数据类型的代码。因此,这是否意味着如果我对几种数据类型进行测试,那么我的代码仍然有可能出乎意料的其他数据类型失败?如果是这样,我该如何确保对所有数据类型强制第二次汇编(根据我的输入,该数据类型是实例化的)。

  1. 编译时间确定的类型仅依赖于静态信息。与特定类型一起使用的功能模板将为该类型生成代码,因为该选项需要在运行时可用。但是,如果可以静态地确定函数调用将永远不会发生,我认为编译器可能会忽略该实施,但是某些情况仍然会强迫。

  2. 您无法测试所有 datatypes,因为这是无限集。您可以创建一组所有标准类型,但是显然您无法检查所有用户定义的类型。通用代码中的想法是不取决于您允许通过的类型的细节。另外,您可能会将可能的实例集关闭到包括您制裁的类型。

我无法理解编译器如何知道可以称为模板代码的数据类型

编译器知道哪些数据类型的模板代码实际调用的,因为它看到了程序中实际调用模板代码的每个位置。这里没有魔术。实例化发生在呼叫站点。对于实际现有调用中未使用的类型,没有进行实例化。

我的代码失败仍然有机会

对于所有基于测试的验证,模板或没有模板,甚至对于软件以外的事物而言,这都是正确的。您无法通过测试涵盖所有可能的用例。这是生活的基本事实。处理它...