PIMPLとは?

1544 ワード

転載先:https://www.cnblogs.com/joinclear/p/3908661.html作者:joinclearありがとう
問題は陳碩《Linuxマルチスレッドサービス端プログラミング》第11章11.4節に由来する.
「C++プログラミング規範」第43条を参考にすることができる
---------------------------------------------------------------------------------------
0、はじめに
PIMPL:実用的な基礎モードです.
1、PIMPL解釈
PIMPL(Private ImplementationまたはPointer to Implementation)は、ポインタが指すクラスの内部実装データをプライベートメンバーポインタで非表示にします.
2、PIMPLのメリット
    :
//x.h
class X
{
public:
    void Fun();
private:
    int i; //add int i;
};

//c.h
#include 
class C
{
public:
    void Fun();
private:
    X x; // X    
};

PIMPL  :
//c.h
class X; //  #include 
class C
{
public:
    void Fun();
private:
    X *pImpl; //pimpl
};
PIMPL  :
//c.h
class X; //  #include 
class C
{
public:
    void Fun();
private:
    X *pImpl; //pimpl
};

PIMPLの利点:
1)モジュールの結合を低減する.クラスの実装が隠されているため、隠されたクラスは元のクラスが見えないことに相当し、隠されたクラスを修正し、元のクラスを再コンパイルする必要はありません.
2)コンパイル依存性を低減し,コンパイル速度を向上させる.ポインタのサイズは(32ビット)または8(64ビット)であり、Xは変化するが、ポインタのサイズは変化せず、ファイルc.hも再コンパイルする必要はない.
3)インタフェースと実現の分離、インタフェースの安定性を高める.
1、コンパイラによって生成されたコードには、「new C」または「C c 1」が定義されている場合、Xの情報はドープされません.
2、Cを使用する場合、Cのインタフェース(Cインタフェース内で操作されるクラスは、実はpImplメンバーが指すXオブジェクト)を使用し、Xに関係なく、Xはポインタパッケージによって徹底的に分離される.
//c.cpp
C::C()pImpl(new X())
{
}

C::~C()
{
     delete pImpl;
     pImpl = NULL;
}

void C::Fun()
{
    pImpl->Fun();
}

//main
#include 
int main()
{
    C c1;
    c1.Fun();
    return 0;
}