新しい ThreadSafeStack の機能はコスト (関数呼び出し) に見合う価値があるため、これはまったく問題ありません。
ラッパー関数の呼び出しは、適切な最適化レベルでインライン化される可能性が高く、その結果、オーバーヘッドはゼロになります。たとえば、このケースを確認してください。ポインターの逆参照がラップされoperator*
ていると、生のポインターの逆参照と同じアセンブラー コードになります。最適化中に、多くのレベルの C++ 抽象化を蒸発させることができます。
ただし、仮想関数呼び出しがインライン化される可能性はほとんどありません。したがって、意味があるときはいつでも通常の関数を使用してください。
しかし、std::mutex をクラス MyMutex にラップして、デバッグ時にログ機能を追加したい場合はどうすればよいでしょうか?
ロギングはかなりのコストを追加する可能性がありますが、デバッグ中にのみ必要な場合は、リリース ビルドでifdef
s またはその他の方法で安全に無効にすることができます。
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 の後) で使用しても問題ありません。ただし、それが受け入れられない場合でも、関数レベルでいつでもディレクティブを使用できます。.cpp
inlucde
using
void foo()
{
using namespace std;
// ...
}