C++ 代码技巧_头文件依赖,Pimpl法

头文件依赖,Pimpl法,加速编译
   举个例子:
      // File: SoundSystem.h

      #include "StreamFilter.h"
      #include "Emitters."

      class SoundSystem {
      public:
         // ...
      private:
         StreamFilter currentFilter;
         EmitModeConfig modeConfig;
      };
   一目了然的是,看得出SoundSystem实现使用了StreamFilter和EmitModeConfig的定义,所以#include 了他们的定义在此SoundSystem.h中,可是随着项目的不断推进,class SoundSystem中依赖的使用类型会增多,它的header被引入到其它模块中,不知不觉的编译时间越来越长,改进之:
      // File: SoundSystem.h

      class StreamFilter;
      class EmitModeConfig;

      class SoundSystem {
      public:
         // ...
      private:
         StreamFilter* currentFilterPtr;
         EmitModeConfig* modeConfigPtr;
      };

      // File: SoundSystem.cpp
      #include "StreamFilter.h"
      #include "Emitters.h"

      SoundSystem::SoundSystem() {
         //...
         currentFilterPtr = new StreamFilter;
         modeConfigPtr = new EmitModeConfig;
      }

      SoundSystem::~SoundSystem() {
         delete currentFilterPtr;
         delete modeConfigPtr;
         //...
      }
      这么一来,把StreamFilter和EmitModeConfig的#include藏到了SoundSystem的实现代码中,以后对SoundSystem的部分改动不会导致其它模块的rebuild哦,不过由此可能会牺牲一点效率吧!

      记得,有位微软的C++翘楚人物,Herb Sutter给这种技巧称为Pimpl ( Private Implemention ), 用的恰到好处时,可以提高项目开发速度,同时模块的头文件间的#include关系得以缓解,可以避开循环依赖,而且可以获得一个良好的物理设计。

总结:
      Pimpl方法感觉很不错,
      使用这个方法的时候,一定要注意的是在这个地方的变化,这个是我第二遍看的时候才注意到的.
     class SoundSystem {
      public:
         // ...
      private:
         StreamFilter currentFilter;
         EmitModeConfig modeConfig;

      };

      采用Pimpl方法后,变为
     class SoundSystem {
      public:
         // ...
      private:
         StreamFilter* currentFilterPtr;
         EmitModeConfig* modeConfigPtr;

      };
      所以在.cpp文件中就有了new和delete的操作.

      对于这种方法有一个疑问?对于那种存在包含众多类的情况下,这种方法的驾驭不是一般人能够掌握的吧.或许这种方法就不太使用了,不如等待一会,编译.

 

解释:当修改StreamFilter或EmitModeConfig的类定义时,在改了后的版本上,SoundSystem重新编译,而#include了SoundSystem.h但没有直接使用StreamFilter或EmitModeConfig的模块不需重新编译,但须重新链接,对于之前的版本可就麻烦了,只要StreamFilter或 EmitModeConfig的定义一改,只要#include “SoundSystem"的模块跟着全都重新编译。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值