は通常のインタフェースとコールバックを実装しています(大まかな例)インターフェイスまたは関数オブジェクトによるコールバック? OO、一
class Message {}
class IMsgProcessor {
public:
virtual void handle_msg(const Message& msg) = 0;
}
class RequestMsgProcessor : public IMsgProcessor {
virtual void handle_msg(const Message& msg) {
// process request message
}
}
class CustomSocket {
public:
Socket(IMsgProcessor* p) : processor_(p) {}
void receive_message_from_network(const Message& msg) {
// processor_ does implement handle_msg. Otherwise a compile time error.
// So we've got a safe design.
processor_->handle_msg(msg);
}
private:
IMsgProcessor* processor_;
}
これまでのところは良いです。 C++ 11では、これを行う別の方法として、CustomSocketに のstd :: functionオブジェクトのインスタンスを受け取るだけです。それが実施される場合、それは気にしませんか オブジェクトがnull以外の値であったとしても:
1.どのようなパフォーマンスへの影響について:今ここに
class CustomSocket {
public:
Socket(std::function<void(const Message&)>&& f) : func_(std:forward(f)) {}
void receive_message_from_network(const Message& msg) {
// unfortunately we have to do this check for every msg.
// or maybe not ...
if(func_)
func_(msg);
}
private:
std::function<void(const Message&)> func_;
}
が質問ありますか?私は、仮想関数呼び出しは、関数オブジェクトを呼び出すよりも速いが、どれぐらい高速であると推測していますか?私は高速のメッセージングシステムを実装しており、むしろ不必要なパフォーマンス上のペナルティを避けたいと考えています。
2.ソフトウェアエンジニアリングの面では、私は第2のアプローチがより好きだと言わなければなりません。少ないコード、少ないファイル、少ないクラッタ:インターフェイスクラスなし。柔軟性の向上:関数オブジェクトの一部を設定し、他の部分をnullのままにして、インタフェースのサブセットのみを実装することができます。あるいは、別々のクラスで実装されたインタフェースの異なる部分を持つことも、フリー関数または両方の組み合わせで実装することもできます(単一のサブクラスではなく)。さらに、CustomSocketは、IMsgProcessorのサブクラスだけでなく、どのクラスでも使用できます。私の意見では、これは大きな利点です。
あなたはどう思いますか?これらの議論に根本的な欠陥がありますか?
と同じ効率を持つ '//残念ながら、私たちはすべてのmsg.'ためには、このチェックをしなければならない - 同じことは、インタフェースコードのために真でなければなりません。あなたはnullポインタを渡さないと決してチェックしません... – Xeo
perfsについて:virtual funcは基本的にテーブル参照を追加します。std :: functionは特殊なアダプタに呼び出しを転送します。あなたの関数/メソッドが仮想でない場合、それは速くなるように最適化されるかもしれません。ベンチマークする必要があります。 'std :: function'をテンプレート引数に置き換えると、仮想呼び出しよりも速くすることができます。 – Antoine
@ Xeo必ずしもそうではありません。インターフェイスコードでは、渡されたオブジェクトがNULLでないことをコンストラクタでチェックします。NULLを受け入れることは意味をなさない。 しかし、2番目のケースでは、インタフェースの部分実装を行うことができるため(つまり、一部の関数オブジェクトのみがnullでない可能性があるため)、チェックが必要です。 – PoP