3

この簡単なプログラムを参照してください

#include <cstdio>
#include <cstdlib>

void foo(){ printf("%d",1); }
int main(){ foo(); }

Linuxで gcc 4.6.4 -std=c++0x -O2 -g -Wall でコンパイルします。そしてバイナリファイル 11`238 バイト。

しかし、このコードは 11`150 バイトになります:

#include <cstdio>
#include <cstdlib>

template< bool = false> void foo(){ printf("%d",1); }
int main(){ foo(); }

また、clang 3.3 でテストしたところ、結果は 5684 バイトとそれに応じて 5636 バイトになりました。

テンプレート バージョン関数がバイナリ コードを作成しないのはなぜですか?

4

3 に答える 3

3

これは単なる推測ですが、次のとおりです。

最初の例でfooは、外部リンケージがあり、インラインではありません。コンパイラは、別の翻訳単位がそれを使用する場合に備えて、おそらく非インライン バージョンを生成します。リンカーはそれを削除せず、実行可能ファイルのスペースを占有したままにする可能性があります。

2 番目の例でfooは、 はテンプレートであるため、リンカーはそれを省略できる可能性が高くなります (テンプレートが複数の翻訳単位でインスタンス化されている場合、複数の定義を処理できる必要があるため)。

何が起こっているのかを確認するには、バイナリを調べる必要があります。最初のものstaticまたはinline.

于 2013-11-05T11:18:05.933 に答える
2

ここには一般的な答えはないと思います。それはコンパイラの実装次第です。

また、違いは非常に小さいため、正しい結論であることを確認することさえ困難です.

生成されたコードを読む必要があります。おそらく、バイトがどこで削られているかについての手がかりが得られるでしょう。

foo()非テンプレート版で作ったら助かりますstaticか?おそらく、インライン化されている場合もあれば、インライン化されていない場合もあります。

于 2013-11-05T11:09:21.450 に答える