1
私は、特性に関するAlexandrescuのチュートリアルに出くわしました。私は分かち合いたいと思います。これはコードです:特性と仮想オーバーヘッド
標準の仮想関数メンバーの場合と比較して、どのくらいのオーバーヘッドがありますか?この場合でもオブジェクトに直接アクセスしているわけではありません。ポインタを渡しています。コンパイラは同じ方法でそれを最適化できますか?
私は、特性に関するAlexandrescuのチュートリアルに出くわしました。私は分かち合いたいと思います。これはコードです:特性と仮想オーバーヘッド
標準の仮想関数メンバーの場合と比較して、どのくらいのオーバーヘッドがありますか?この場合でもオブジェクトに直接アクセスしているわけではありません。ポインタを渡しています。コンパイラは同じ方法でそれを最適化できますか?
典型的な生産最適化レベル(-O2
または/O2
)では、示したすべてのコードがインライン化され、副作用のないビットが最適化されます。実際の通話はIncRef
またはAddReference
になり、チェックはdelete
-ionになります。
virtual
関数が使用されていて、参照カウントコードが簡単な場合(スレッドセーフではないなど)、ディスパッチテーブルの参照や行外関数呼び出しのために約1桁遅くなっている可能性がありますそれはコンパイラ、正確な最適化設定、CPU、呼び出し規約などで少し変わってきます。
いつもと同じように、気にする必要があるときは、プロファイルと実験。
私がよく理解していれば、最適化されたときのコードはポインタのコピー権なしで直接p-> IncRef()を呼び出すようなものでしょうか?あまりにも一桁大きいようです。完全なプロファイリングに同意します:) – user3770392
* "...右?" *右。 *「大きすぎる1桁の大きさ」* - ランタイムスイッチと仮想ディスパッチによって選択された些細な機能を呼び出すことと対比さえ、[このベンチマーク]で9.2倍の要因をもたらしました(http://stackoverflow.com/a/4801861/410767)、ベンチマークコード/結果を測定して共有することは常に良いことです。この場合、 'IncRef()' 'DecRef()'はスレッドの安全性が必要な場合にはそれほど簡単ではないので、追加の仮想ディスパッチの影響は小さくなります。 –
説明ありがとうございます:) – user3770392