美文网首页
Pimpl机制

Pimpl机制

作者: 爱玩保龄球 | 来源:发表于2020-02-19 15:49 被阅读0次

1.简介

这个机制是Private Implementation的缩写,我们常常听到诸如“不要改动你的公有接口”这样的建议,所以我们一般都会修改私有接口,但是这会导致包含该头文件的所有源文件都要重新编译,这会是个麻烦事儿。Pimpl机制,顾名思义,将实现私有化,力图使得头文件对改变不透明。

2.机制分析

首先,我们先看看不使用这个机制的一个实现:

  1: // MyBase.h
  2: class MyBase {
  3: public:
  4:   int foo();
  5: };
  6: 
  7: // MyDerived.h
  8: #include "MyBase.h"
  9: class MyDerived : public MyBase {
 10: public:
 11:   int bar();
 12: };

假设你现在希望在MyBase.h中加入一个新的private和protected成员函数,那么MyDerived和所有包含MyBase.h的源文件都需要重新编译。在一个大工程中,这样的修改可能导致重新编译时间的激增。你可以使用Doxygen或者SciTools看看头文件依赖。

一般来说,不在头文件中包含头文件是一个比较好的习惯,但是这也不能完全消除修改MyBase.h带来的重新编译代价。有没有一个机制可以使得对私有接口做修改时我们可以减小重新编译的代价。

在Pimpl机制中,我们使用前置声明一个Impl类,并将这个类的一个指针实例放入主类中,如下:

1: // MyClass.h
  2: class MyClassImpl;    // forward declaration
  3: class MyClass {
  4: public:
  5:   MyClass();
  6: ~MyClass();
  7:   int foo();
  8: private:
  9:   MyClassImpl *m_pImpl;
 10: };

现在,除非我们修改MyClass的公有接口,否则这个头文件是不会被修改了。然后,我们用这个Impl类的实现来完成主类的细节实现,在主类的构造函数中,我们完成了实现类指针的实例化:

 1: // MyClass.cpp
  2: class MyClassImpl {
  3: public:
  4: int foo() {
  5:         return bar();
  6: }
  7: int bar() { return var++; }
  8:         int var;
  9: };
 10: 
 11: MyClass::MyClass() : m_pImpl(new MyClassImpl){}
 12: 
 13: MyClass::~MyClass()
 14: {
 15:     try {
 16:             delete m_pImpl;
 17:     }
 18:     catch (...) {}
 19: }
 20: 
 21: int MyClass::foo(){ return m_pImpl->foo(); }

Pimpl机制其实这是桥接模式的一种变种。我们可以对实现类随意的进行增删和修改,而不会导致包含MyClass.h的源代码重新编译。当然,这样做的时间开销和空间开销也是有的。

在实践中,我们常常采用内部类来完成Pimpl机制:

1: // header
  2: class fruit
  3: {
  4: public: 
  5: 
  6: private:
  7: class impl;
  8: impl* pimpl_;
  9: } 
 10: 
 11: // implementation
 12: class fruit::impl
 13: { 
 14: 
 15: }; 
 16: 
 17: fruit::fruit()
 18: {
 19: pimpl_ = new impl();
 20: }

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

相关文章

  • Pimpl机制

    1.简介 这个机制是Private Implementation的缩写,我们常常听到诸如“不要改动你的公有接口”这...

  • Pimpl机制

    1.简介 这个机制是Private Implementation的缩写,我们常常听到诸如“不要改动你的公有接口”这...

  • 《C++ API设计》读书笔记之 《Pimpl惯用法》

    Pimpl是“pointer to implementation”的缩写, 该技巧可以避免在头文件中暴露私有细节。...

  • 实现一个不抛异常的swap函数

    一个基本的swap函数大概如上所述,但是对某些类型而言。典型比如:pimpl手法(pointer to imple...

  • 前言之Pimpl惯用法

    最近,在公司移植需求,遇到一些比较有代表性的难题,忽然发现没有足够的知识储备,也设计不出好的解决方案,导致这次移...

  • 如何提高 C++ 项目的编译速度

    C++ 项目的编译时间一般可以从以下几个角度进行优化: 使用 Pimpl 模式 移动语义替代复制语义 前向声明替代...

  • 【Exceptional C++(16)】Fast Pimpl技

    malloc()和new()调用开销很大,下面代码最初在class Y中设计了一个类型X的成员 这个class Y...

  • 摘要

    监狱安全管理的机制,由领导责任机制,安全防控机制,隐患排除机制,应急处置机制,狱情搜集机制组成。领导责任机制,坚持...

  • Android开发者需掌握的进阶技能

    1:熟悉各大Android 机制(handler机制,事件分发机制,binder机制...) 2:熟悉 view ...

  • RunTime

    前言 RunTime简称运行时机制,其实OC就是一种运行时机制(消息机制是运行时机制中最重要的机制) 消息机制:任...

网友评论

      本文标题:Pimpl机制

      本文链接:https://www.haomeiwen.com/subject/enpafhtx.html