如何证明在 C++ 中编译模板时,编译器会在每个使用它的编译单元中生成一个实例化,然后链接器会丢弃除其中一个之外的所有模板[通用模型];所以我们应该证明两件事 1. 创建多个副本 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 值
:1
值:0
所以第二个已经被证明了;
但我无法证明
我在谷歌上搜索的第一个,并有如下一些建议
1. 使用转储
是的,我们可以转储 objfile 并获得结果
但是我们可以写一些代码来输出一些东西来证明吗?