C++:如果一个项目没有包含,但仅使用 C++20 模块,编译器会看到每个函数体吗?

问题描述 投票:0回答:1

以这段代码为例(用于演讲 LLVM Optimization Remarks - Ofek Shilon - CppCon 2022,at 21:28):

void somefunc(const int&);
int whateva();

void f(int i, int* res)
{
    somefunc(i);
    i++;
    res[0] = whateva();
    i++;
    res[1] = whateva();
    i++;
    res[2] = whateva();
} 

由于

somefunc
whateva
的主体不可用于此翻译单元(从现在起为 TU)中的编译器,因此可能会错过很多优化机会。

如果您的项目仅使用 C++20 模块,这个问题是否“解决”了?据我所知,在使用模块时,编译器会生成一些包含有关模块的元数据的文件,类似于预编译头,我们将其称为预编译模块,并且这些预编译模块必须包含在任何其他模块中(在命令行上)导入它们。

这是否意味着在使用模块时“翻译单元边界悲观化”(我编造了这个名字;我不知道它是否有一个)肯定消失了,因为所有模块都会看到所有的主体(感谢附加的预编译-每个功能的模块)?

换句话说,如果您的项目不使用任何单个

#include
(动态链接库除外),那么新的“编译器可见性边界”(忽略 LTO)是什么?

c++ c++20 compiler-optimization c++-modules
1个回答
0
投票

如果您的项目仅使用 C++20 模块,这个问题“解决”了吗?

没有。

可以将这些函数定义(

inline
d)放入模块接口文件中。这将使编译器在导入此类模块时可以使用函数定义。但这并不仅仅因为您将代码构建为模块而发生。如果您将该函数放入模块实现单元中,那么导入该模块的 TU 将看不到该函数。

这与将定义放入标头和源文件中本质上没有什么不同。主要区别在于,对于模块,编译器不必在每次导入文件时编译该定义的代码。

© www.soinside.com 2019 - 2024. All rights reserved.