0

私の質問は、std ライブラリからいくつかのコンテナーまたはオブジェクトをラップすることと、そのためのコストについてです。ThreadSafeStackクラスを作成する必要があるとしましょう。コンテナーをラップし、std::stackミューテックスを使用してスレッド セーフにします。ThreadSafeStack新しい機能はコストに見合う価値があるため(関数呼び出し)、これはまったく問題ありません。しかし、デバッグ時にロギング機能を追加するために をstd::mutexクラスにラップしたい場合はどうすればよいでしょうか? MyMutexあなたの意見では、それだけの価値があるでしょうか?

そして、便宜上、書き込みを避けるために、std::またはusing::stdすべてのファイルにそのようなことをした場合はどうなりますか? ばかげていると思いますか?

関数呼び出し (たとえば、このような) について少し読んだことがありますが、大きなオーバーヘッドにはならないと思います。

4

1 に答える 1

2

新しい ThreadSafeStack の機能はコスト (関数呼び出し) に見合う価値があるため、これはまったく問題ありません。

ラッパー関数の呼び出しは、適切な最適化レベルでインライン化される可能性が高く、その結果、オーバーヘッドはゼロになります。たとえば、このケースを確認してください。ポインターの逆参照がラップされoperator*ていると、生のポインターの逆参照と同じアセンブラー コードになります。最適化中に、多くのレベルの C++ 抽象化を蒸発させることができます。

ただし、仮想関数呼び出しがインライン化される可能性はほとんどありません。したがって、意味があるときはいつでも通常の関数を使用してください。

しかし、std::mutex をクラス MyMutex にラップして、デバッグ時にログ機能を追加したい場合はどうすればよいでしょうか?

ロギングはかなりのコストを追加する可能性がありますが、デバッグ中にのみ必要な場合は、リリース ビルドでifdefs またはその他の方法で安全に無効にすることができます。

const bool do_logging = false; // somewhere
// ...
if(do_logging) // branching can be easily removed by optimizer,
               // because do_logging is constant
    // ...
else
    // ...

あなたの意見では、それだけの価値があるでしょうか?

はい、もちろん。標準ライブラリ機能に基づいて、より有用な抽象化を構築することは一般的な方法です。

そして、すべてのファイルで std:: を記述したり ::std を使用したりするのを避けるために、便宜上、そのようなことを行うとどうなりますか? ばかげていると思いますか?

プロジェクトによって異なります。場合によってはusing namespace std、ヘッダー ファイルで使用しても問題ありません。ただし、そのようなヘッダーを含める人は、名前の衝突に直面する可能性があることに注意してください。

ほとんどの場合、ファイルusing namespace stdの先頭( s の後) で使用しても問題ありません。ただし、それが受け入れられない場合でも、関数レベルでいつでもディレクティブを使用できます。.cppinlucdeusing

void foo()
{
     using namespace std;
     // ...
}
于 2013-10-28T09:46:35.733 に答える