0

C ++でテンプレートをコンパイルするときに、コンパイラがそれを使用する各コンパイル単位でインスタンス化を生成し、リンカーがそれらの1つを除くすべてを破棄することを証明する方法[共通モデル]; したがって、証明すべきことが 2 つあります。 1. 複数のコピーを作成する 2. リンク時にコピーを削除する

2番目のものは次のようなコードを使用することを証明できます

////head.h
#ifndef _TEMP_H
#define _TEMP_H


#include <typeinfo>
#include <iostream>
template<typename T>
class Test
{
public:
Test(T i = 0) : val(i) {}

void getId() const
{
    std::cout << typeid(*this).name() << std::endl;
}

void getVal() const
{
    std::cout << "Val: " << val << std::endl;
}
 private:
T val;
};

#endif

//a.cpp
#include "head.h"

Test<int> a(1);

//b.cpp
#include "head.h"

extern Test<int> a;

int main()
{
Test<int> b;

a.getId();
b.getId();

a.getVal();
b.getVal();
return 0;
}

コンパイラ: g++ 4.4.1

結果を得る:

4TestIiE
4TestIiE
Val: 1
Val: 0

したがって、2 つ目は証明されました。

しかし、私はそれをグーグルで最初のものを証明することはできず、次の
ようにいくつかの提案があり
ます1.ダンプを使用
はい、objfileをダンプして結果を取得できます

しかし、それを証明するために何かを出力するコードを書くことはできますか??

4

2 に答える 2

0

1番は簡単です。一連の異なるソース ファイルを作成し、それぞれにテンプレート ヘッダーを含め、テンプレート クラスを使用して出力を生成するだけです。次に、各ソース ファイルを個別にコンパイルします。次に、それを呼び出すメイン プログラムで、それらを 1 つずつリンクします。リンカー エラーが発生しないのに、プログラムが出力を生成する場合は、コンパイルされた各オブジェクト ファイルにテンプレート コードが含まれていることを証明します。

PS余分なコピーは削除されない可能性があり、実行可能ファイルにデッドコードとして存在する可能性があります。

于 2013-06-12T03:00:52.927 に答える