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をダンプして結果を取得できます
しかし、それを証明するために何かを出力するコードを書くことはできますか??