大量警告会增加编译时间吗?

ars*_*ars 15 c c++ compilation compiler-warnings visual-studio

我从某人那里听说,代码构建中大量警告的大型项目比警告少的警告要慢得多(当然,编译器设置为具有高级警告敏感性).

有没有合理的解释,或者也许有人可以分享他们对这个主题的经验?

Bas*_*tch 8

GCC编译器(例如,gcc对于C或g++C++)上,警告确实占用了少量的CPU时间.使用例如gcc -ftime-report,如果你想编译时间的详细报告.警告诊断确实取决于优化级别.

但优化(特别是在高水平,如同-O2或更多)需要比警告花费更多的时间.根据经验,优化的编译时间与编译单元大小和最大函数的大小的平方(例如,Gimple指令的数量,或C代码行)成正比.因此,如果您具有巨大的功能(例如,某些生成的C代码中有一万行的某些功能),您可能希望将它们分成更小的部分.

MELT的早期阶段(GCC插件和GCC实验分支-GPLv3 +许可 - 实现DSL扩展GCC,我已经开发并且仍在继续),它在C中生成了巨大的初始化函数(今天它的情况更少) ,初始化分为许多C++函数;例如,参见GCC的MELT分支中的gcc/melt/generated/warmelt-base.cc).那时,我绘制了编译-O2时间与初始化函数的长度,并测量了编译时间与其长度的关系.您还可以尝试使用manydl.c代码.同样,最大函数长度的平方是一个实验测量,但可能由寄存器分配问题来解释.此外,J.Pitrat还观察到巨大的C函数 - 通过他有趣的CAIA系统 - 正在耗尽编译器.

此外,警告输出,有时候,如果你有很多警告的IDE或终端读取编译器的输出可能会减慢.

当然,多次评论,编译器警告是你的朋友(所以总是用eg编译gcc -Wall).因此,请改进您的代码,以免得到任何警告.(特别是,初始化大多数局部变量 - 我通常会初始化所有这些变量;因为编译器可以通过删除一些初始化来优化,如果可以证明它们是无用的).

顺便说一句,您可以使用例如MELT自定义GCC 以添加您自己的自定义警告(例如,检查一些编码规则的一致性).

此外,在带有奇怪模板的C++中,您可以编写几十行,这些行需要花费数小时才能编译(甚至因为内存不足而导致编译器崩溃,请参阅此问题).