1

私のプロジェクトでは、プロジェクトのいくつかのコーディング標準要件に従うように作成された、1 つのユーザー定義のデフォルト デストラクタがありました。このデストラクタのクラスは 200 回以上インスタンス化されたため、全体的な応答時間が増加しました。このデストラクタを削除すると、応答時間が 28 ミリ秒短縮されました。このタイミングの違いの理由を誰でも説明できますが、これらはデフォルトのデストラクタのみでしたが、ユーザーによって定義されており、とにかくコンパイラによって呼び出されます。

「ユーザー定義のデフォルトデストラクタ」の使用により、空のデストラクタを意味しました:

~Classname(){ };

何もしませんが、プロジェクトの基準を満たすために追加されます。

明確にするために、このデストラクタは次のカテゴリには分類されません。

1 .「仮想」として宣言されたデストラクタ。

2 .静的およびシングルトン クラスのデストラクタ。

3 .「new」キーワードを使用してオブジェクトが作成されたクラスのデストラクタ。

4 .「delete」キーワードを使用してオブジェクトが削除されたクラスのデストラクタ。

4

1 に答える 1

5

コンパイラが空のデストラクタを正しく認識しないいくつかの場所に遭遇しました

  • MSVC は、デストラクタが空であっても、ユーザー定義のデストラクタを持つオブジェクトを返す場合、関数をインライン化できません。

  • is_trivialなどの型特性はis_pod、私がテストしたどのコンパイラでも、空のデストラクタで望むようには機能しません。これにより、一部のアルゴリズムまたはコンテナーが特定の型に対してどのように実装されるかが変わる可能性があります。

  • コンパイラはスタックをアンワインドするためのコードを作成する必要があるため、ユーザー定義のデストラクタによって例外処理コードが変更される場合があります。繰り返しますが、私の記憶が正しければ、MSVC はこの目的でも空のデストラクタを正しく認識しません。

  • new T[]T に自明でないデストラクタがある場合、使用するすべての割り当てでは、アイテム数に余分なスペースを割り当てる必要があります。また、メモリ ブロックのアラインメントが変更される可能性があり、パフォーマンスが大幅に低下する可能性があります。MSVC も g++ も、空のデストラクタに対してこれを正しく最適化しません。

于 2012-04-24T19:27:08.350 に答える