冗余包含卫哨如何加快编译速度?

最近读了两本书,一本是《大规模C++程序设计》,另一本是《C++必知必会》。
里面都有提到卫哨这个概念,譬如包含卫哨(内部卫哨)和冗余包含卫哨(外部卫哨)。
其实包含卫哨大家平时编程过程中是用的特别特别多的,
#ifndef HDR1_H
#define HDR1_H
//头文件的实际内容
#endif

 

如果面试过程中问到这个有什么作用,相信很多童鞋都能应答自如的了。

但其实真正让我感兴趣的是冗余包含卫哨,或者叫外部卫哨。
#ifndef HDR1_H
#include “hdr1.h”
#endif

 

按书上面的说法是,针对大型项目,特别是头文件多,头文件行数多,
使用冗余包含卫哨能提高编译速度,甚至成倍(这个在《大规模》一书中有具体测试数据)。

我对它提提高编译速度很感兴趣,同时对它是如何能够提高编译速度更感兴趣了。

按照《C++必知必会》的说法,是因为“打开一个头文件、验证#ifndef并扫描结束符#endif”这个过程非常耗时。


对照上面的解析,我们重点分析:
1、打开一个头文件费时?
如果重复性打开又多又大的头文件,的确会耗费时间。
2、验证#ifndef费时?
这个不太成立,作为一个布尔判断,花不了几个指令。
同时,冗余包含卫哨本身就带有一个#ifndef的判断了,所以这个猜测不成立。
3、扫描结束符#endif费时?
如果头文件很大,也就是行数很多,扫描的确是件费时的工作。特别是需要在同一个很大的头文件中重复这样做。
个人不清楚预编译器是如何实现的,但对是否有必要扫描#endif表示怀疑。
如果#ifndef不成立,代表该文件已经定义过了,为什么还非要扫描#endif呢?为什么不马上结束?
难道是必须满足#ifndef和#endif配对的语法要求,所以就坚持扫描?

 

基于上面的3点分析,个人觉得耗时的最大可能就是第3点,然后是第1点,至于第2点,不认同。

另外,为什么冗余包含卫哨在头文件有用,在cpp文件无用呢?
这个问题可能需要对预编译器实现流程熟悉才能比较合理的解析了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值