6

多数のメソッド(ベクトルなど)でテンプレートを使用してコードをコンパイルする場合、コンパイラーは未使用のメソッドからコードを破棄しますか?

4

4 に答える 4

6

テンプレートは、使用されない限りインスタンス化されないため、実際に破棄するコードはありません。

規格によると(14.7.1/10)

実装は、関数テンプレート、メンバーテンプレート、非仮想メンバー関数、メンバークラス、またはインスタンス化を必要としないクラステンプレートの静的データメンバーを暗黙的にインスタンス化してはなりません。仮想メンバー関数が他の方法でインスタンス化されない場合に、実装がクラステンプレートの仮想メンバー関数を暗黙的にインスタンス化するかどうかは指定されていません。デフォルトの引数でテンプレートの特殊化を使用しても、デフォルトの引数の正しさを判断するために完全な型が必要な場合にクラステンプレートがインスタンス化される場合を除いて、テンプレートが暗黙的にインスタンス化されることはありません。関数呼び出しでデフォルト引数を使用すると、デフォルト引数の特殊化が暗黙的にインスタンス化されます。

したがって、テンプレートのメンバー関数を仮想化することを回避できる場合、コンパイラーはそれらのコードを生成しません(コンパイラーが十分に賢い場合は、仮想関数でも機能する可能性があります)。

于 2012-08-09T21:05:23.633 に答える
4

それはあなたの最適化レベルに依存します。より高い最適化設定では、はい、デッドコードの除去が発生する可能性が最も高くなります。

于 2012-08-09T19:58:44.393 に答える
1

コンパイラ、オプティマイザ、およびリンカは、その情報を省略および/または削減できます。各成熟したツールには、デッドコード除去に固有のオプションがある可能性があります。

テンプレートを使用すると、コードは最初から実際には作成されない場合があります(インスタンス化されていない場合)。

ただし、すべてのシナリオですべてが削除されるわけではありません(rttiはサイレントキラーです)。ビルド設定を使用した少しの注意とテストは、バイナリサイズとデッドコードを減らすのに大いに役立ちます。

于 2012-08-09T19:58:59.163 に答える
0

スマートコンパイラはそれを除外する可能性が最も高いでしょう。ずっと前にBorlandC++ Builderで遊んだとき、未使用のテンプレートクラスメソッドを捨てなかったと思います。確認できません

于 2012-08-09T20:01:21.480 に答える