@
vcfghtyjc 你说对了,源码长度就是很长,而且还很复杂。
纯 C 语言的头文件一般只有声明所以速度相对快,但是 C++ 不同。为了追求 zero-cost abstraction ,C++ 的很多东西声明和定义全部都在头文件里面,而且模板 meta-programming 对于编译器是复杂的东西。这样叠加上去就,超级慢。一个 C++ 源代码文件 include 展开以后有几百上千 KB ,几百上千个 template class ,我觉得毫不意外。每个源文件都给你来这一套,想想多复杂。
C++20 的 module 就是规定,一些头文件不受其他头文件 macro 的影响。这样你就能预编译这些头文件,就不会有那么多重新编译的开销了。
在 C++20 module 前,业界最佳的实践是 Qt ,大量使用 private class + pointer ,尽量避免使用 template ,达到了很好的编译速度。然而,由于使用这两个技术,所以毕竟不是 zero-cost abstraction ,因此在运行速度上是打折了的。当然比起 node.js 还是秒杀。
最后简要介绍 zero-cost abstraction 。这东西看一个例子:
* C 语言的库函数 qsort 要传入一个函数指针。
* C++ 的库函数 std::sort 传入的是模板函数。
函数指针是不能内联优化的,因此每两个元素比较都不得不进行一次函数调用,有固有性能损失。
模板函数是可以内联优化的,相当于消除了这一次函数调用。更何况消除以后 C++ 可以进一步做指令集优化。
所以 C 语言 qsort 比 C++ 慢。