mon*_*jet 3 c++ templates c++20 c++-modules
一般来说,使用函数模板会使编译时间显着延长。
一位朋友建议我检查模块(C++20)进行优化。
我认为这根本不会影响编译速度。
我不知道如何测试这个,所以我在这里问。
下面的代码会以某种方式神奇地优化构建过程吗?
定义仍然需要创建和编译,所以不会有任何区别?
数学.xxx:
module;
#include <typeinfo>
export module math;
import <iostream>;
export
template<typename T>
T square(T x) {
std::cout << typeid(T).name() << std::endl;
return x * x;
}
Run Code Online (Sandbox Code Playgroud)
主程序
import math;
void main() {
square(int());
square(double());
}
Run Code Online (Sandbox Code Playgroud)
该代码示例对于模块来说太琐碎了,没有任何实际用途。一个文件包含第二个文件,并且不包含任何其他文件,这不是编译问题。这就像尝试对两个整数文字相加的速度进行基准测试,然后对 C++ 加法运算符的质量做出声明。
从性能角度来看,模块解决了以下问题:它们使重新编译单个文件的成本不等于重新编译第一个文件包含的每个文件的成本,无论包含的文件是否发生更改。
如果您#include <vector>在一个简单的程序中,您的源文件现在包含数千行代码。如果更改该源文件,编译器将不得不重新编译数千行未更改的代码。如果您有 1000 个文件,每个文件都包含<vector>,那么您现在就有 1000 个相同的副本,每次编译所有这些文件时,<vector>编译器都必须编译这些副本。
这是模块要防止的事情。如果您导入库的模块,则更改源文件不需要重新编译那些包含的标头。如果您在数百或数千个文件中导入数十个模块,那么这会很快增加。
在预模块中,对广泛包含的标头进行小的更改会提示整个项目的完全重新编译。在完全模块化的代码库中,会有很多文件需要重新编译。但不会发生的是您重新编译不依赖于更改的内容。您可能更改了广泛使用的标头,但没有更改 C++ 标准库。因此,如果您通过模块包含它,那么<vector>就不会重新编译。
这就是模块节省性能的地方。
| 归档时间: |
|
| 查看次数: |
808 次 |
| 最近记录: |