说一个反直觉的事情,一个巨无霸 CPP 源文件的编译速度,要快于实现相同功能的一堆小文件。

查看 168|回复 10
作者:tool2d   
理由是 C++是按照 CPP 文件单独编译的。一堆小 CPP 文件,头文件会很重复包含多次,编译器每次都会解析一遍,就会很慢。
但是把所有函数硬塞进一个巨无霸 CPP 文件,显然也是很不合理的。
那么问题来了,有没有办法即兼顾编译速度,又能合理按照小功能划分源文件?

Cpp, 文件, 编译, 巨无霸

learningman   
"头文件会很重复包含多次,编译器每次都会解析一遍,就会很慢"
#pragma once
#ifundef AAA
#def AAA
#endif
msg7086   
换一个不会每次都会解析一遍的编译器?
AllenTsui   
可读性 >>> 运行性能 >>> 编译性能
yanqiyu   
https://en.cppreference.com/w/cpp/language/modules
@learningman
OP 指的应该是不同翻译单元都用到的头文件解析耗时,比如 STL 里面模板库的展开,每个翻译单元都要一次
没啥好方法,要么做一些结构性的更改,要么就用 C++20 的现在编译工具链支持不是很好的 modulws
codehz   
不可以并行化吗
然后如果源文件没变的话,不可以直接用缓存的结果吗
然后,还有 pch 和 c++模块系统呢
ysc3839   
实际开发时基本都会开启预编译头,拆分成多个 cpp 是更快的,而且拆分的话改了其中一个 cpp 后只需要重新编译这个 cpp 即可,不需要全部重新编译,也会快很多。
cnbatch   
长久以来的做法是,使用 Precompiled Header (预编译头)功能
如果用上了 C++20 ,可以尝试下 Modules
tool2d
OP
  
@learningman 没说清楚,比如有 10 个小的 cpp ,每个模块都需要重复解析一次头文件。
也就是一共要解析 10 次。
acctv2   
没有具体实践过,理论上一大堆小文件链接时间会更长,所以有可能。
头文件一遍遍解析? ifndef 不行吗
您需要登录后才可以回帖 登录 | 立即注册

返回顶部