
どちらの使用するか迷っています。ご助言をお願いします。
インターフェイスだけ晒して、メンバ変数を完全に見えないようにするためには、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です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javaでカレンダー作成
-
java の配列についての質問です。
-
Java 初心者 int型の取り扱い方
-
JAVAでCの関数ポインタのような...
-
sin曲線とcos曲線を描くプログ...
-
ORA-01858: 数値を指定する箇所...
-
C言語のポインターに関する警告
-
0dの意味を教えてください
-
オブジェクトの中のプロパティ...
-
ダブルクォーテーションを含む...
-
JSPやサーブレットでSystem.out...
-
System.err. printlnとSystem.o...
-
csv出力について
-
ダブルクォーテーションのrepla...
-
nullcline
-
Formの値が変更されたかどうか...
-
tomcatのstdout.logを停止したい。
-
文字コード変換
-
IF関数でEmpty値を設定する方法。
-
Path型をString型へ変換する(Java)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
C#で実行時にメソッドの返り値...
-
メインが含まれていません
-
(Swing)JTextFieldを半角のみ入...
-
javaでcsvファイル読込時の改行...
-
式の型は配列型で int に解決済...
-
JAVA エラー 式の開始が不正で...
-
C言語からJavaに書き換えの質...
-
前の月を取得したいです。
-
行の途中から読み込む方法
-
素数のみの足し算
-
Java 初心者 int型の取り扱い方
-
共有メモリについて
-
DataSet(DataTable)の使い方
-
c# デリゲート関連の命名について
-
先入れ先出し法のプログラミン...
-
java spring でエラーが出て困...
-
JAVAでCの関数ポインタのような...
-
誰か~誰か~誰か~一生のお願...
-
いまいちfor文が分かりません ...
おすすめ情報