重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

どちらの使用するか迷っています。ご助言をお願いします。
インターフェイスだけ晒して、メンバ変数を完全に見えないようにするためには、pImplパターンがあると思います。

//--------------------------------------------------------
//header.h
class Imp;
class TestPImpl
{
  Imp*pImpl;
public:
  TestPImpl();
  void Func();
};
//cpp.cpp
class Imp
{
  int i;
public:
  void Func()
  {
   i++;
  }
};

TestPImpl::TestPImpl()
{
 pImpl = new Imp;
}
void TestPImpl::Func()
{
 pImpl->Func();
}
//--------------------------------------------------------

一方、次のようにやることも可能です(呼び名は知りません)。
//--------------------------------------------------------
//header.h
class VirtualBase
{
public:
  virtual void Func() =0;
};
VirtualBase*CreateVirtualBase();

//cpp.cpp
class VirtualDeri : public VirtualBase
{
  int i;
public:
  void Func()
  {
   i++;
  }
};

VirtualBase*CreateVirtualBase()
{
  return new VirtualDeri;
}
//--------------------------------------------------------

このほうが、変数も見えず見た目のすっきりします。
さらに、速度を計測をしました。
//--------------------------------------------------------
//main.cpp
int main()
{
  const int MAX_CNT = 10000000;

  VirtualBase*v = CreateVirtualBase();
  long startTime = timeGetTime();
  for(int i=0;i<MAX_CNT;i++)
   v->Func();
  printf("Vertial:[%d]\n",timeGetTime() - startTime);
  TestPImpl*p = new TestPImpl();
  startTime = timeGetTime();
  for(int i=0;i<MAX_CNT;i++)
   p->Func();
  printf("pImpl:[%d]\n",timeGetTime() - startTime);
}
結果
>Virtual[336]
>pImp[594]
//--------------------------------------------------------

後者の方が、速度的には有利です。(本来ならば、出力されたアセンブリなどを見て、勝手に"省略"されたかを確認する必要があるのかもしれませんが、現状自分はアセンブリを読むことはできません。)
ここで質問です。よりシンプルに、かつ速度的にも有利に見える後者ではなく、pimplパターンを使うメリットは何なのでしょうか?

初めてpimplパターンを知ったときの宣伝は、コンパイル時間の短縮でした。しかし、後者の方法もヘッダを書き変えずにメンバ変数を変更することは可能なので、このメリットは後者の方法でも同じことです。

このような方法をとりたいと思っているのは、コンパイル時間を短縮するためではなく、現在作成しているDLLのヘッダに一切の変数を書きたくなかったからです。
DLLにすると、上記の実験の結果が変化するかはまだ確認していません。(DLLにすることにより状況が変わるかもしれないと考えています。)

質問内容自体にも間違い含まれているかもしれません。合わせてご助言お願いします。
環境はXP SP2 , VC8です。

A 回答 (1件)

ひとつ挙げるなら、


pImplなら実装を"動的に差し替える"ことができます。
    • good
    • 0
この回答へのお礼

やはりそれぐらいですか。。。(それぐらいが大きいのかもしれませんが)
今回はpImplは封印することにしました。
返信ありがとうございます。

お礼日時:2008/05/13 17:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!