假设我有两种定义函数的选择。我可以在头文件中定义它并包含该头文件。或者我可以在 C++20 模块中定义该函数,将其导出,然后将其导入到需要它的翻译单元中。由于在标头中它是内联定义的,因此编译器可以“看到”并内联它,没有问题。一般来说,如果技术上没有在头文件中内联定义,编译器仍然可以将其内联作为链接时优化的一部分(我认为链接器会在链接阶段再次调用编译器来执行此操作)。
就模块而言,我们基本上是在谈论与我刚才提到的后者相同的事情吗?即,模块基本上就像一个已编译的目标文件,编译器无法“看到”它,直到链接阶段,那是。这对编译器的优化有什么影响?
是的,对于模块,函数是单独编译的,就像目标文件一样,编译器仅在链接阶段“看到”它们。内联等优化发生在链接时,类似于标头中的链接时优化 (LTO)。因此,模块稍后优化,但工作方式与 LTO 类似