質問 |
||
| QNo.4011938 | VirtualとpImplの速度について | |
|---|---|---|
| 質問者:qOat |
どちらの使用するか迷っています。ご助言をお願いします。 インターフェイスだけ晒して、メンバ変数を完全に見えないようにするためには、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です。 |
|
困り度:
|
||
| 質問投稿日時: 08/05/10 17:28 |
||
回答良回答20pt |
|
| ANo.1 | ひとつ挙げるなら、 pImplなら実装を"動的に差し替える"ことができます。 |
|---|---|
| 回答者:episteme | |
| 種類:アドバイス どんな人:専門家 自信:自信あり |
|
| 回答日時: 08/05/11 02:37 |
|
| |
| この回答へのお礼 | やはりそれぐらいですか。。。(それぐらいが大きいのかもしれませんが) 今回はpImplは封印することにしました。 返信ありがとうございます。 |