上QQ阅读APP看书,第一时间看更新
1.2.2 一个需要漫长编译过程的程序
当程序体量逐渐变得庞大,编译时间也会越来越长。C++更是经常因为编译速度慢而被大家诟病。因此,我们在工程上常采取很多手段优化编译时间。其中,最简单直接的手段就是避免不必要的编译。简言之,当多次编译多份源文件时,编译器应当聪明地只把修改过的源程序重新编译,而复用其他未修改的已经编译好的程序。
为了演示这一策略的有效性,我们需要一个非常耗时的编译过程用于对比。当然,读者肯定不会乐意在第1章就接触一个庞大的工程案例。因此,本书在这里采用了C++“黑魔法”,也就是一段糟糕的模板编程来模拟需要长时间编译的源程序。本书不会讲解该程序细节,相关实现细节感兴趣的读者可自行参考本书配套资源。
本例将会输出斐波那契数列第25项的值。主程序main.cpp如代码清单1.4所示。
代码清单1.4 ch001/漫长等待/main.cpp
#include <iostream>
extern int fib25;
int main() {
std::cout << "斐波那契数列第25项为:" << fib25 << std::endl;
return 0;
}
主程序中声明的外部变量fib25被定义在另一个源程序slow.cpp中。这个源程序就是模拟长耗时编译的源程序,由于有“黑魔法”的存在,我们暂且不去关心它的写法。
使用MSVC构建本例
> cd CMake-Book\src\ch001\漫长等待
> cl main.cpp slow.cpp /EHsc
> .\main.exe
斐波那契数列第25项为:75025
MSVC编译器的/EHsc参数用于启用C++异常处理的展开语义,如果不指定会产生警告。其具体用途请参考其官方文档。
这个编译过程在笔者的移动工作站上运行了超过20秒!
使用GCC构建本例
GCC编译器编译该项目也需要十几秒的时间,过程如下:
$ cd CMake-Book/src/ch001/漫长等待
$ g++ main.cpp slow.cpp
$ ./a.out
斐波那契数列第25项为:75025