如何证明在C+中编译模板时+;,编译器创建多个副本,并在链接时删除副本 如何证明在C++中编译模板时,编译器在每个编译单元中生成一个实例化,然后链接器抛掉所有其中一个[CAMDMODEL模型]; 所以有两件事我们应该证明 1.创建多个副本2.链接时删除副本
我们可以证明第二个使用的代码如下如何证明在C+中编译模板时+;,编译器创建多个副本,并在链接时删除副本 如何证明在C++中编译模板时,编译器在每个编译单元中生成一个实例化,然后链接器抛掉所有其中一个[CAMDMODEL模型]; 所以有两件事我们应该证明 1.创建多个副本2.链接时删除副本,c++,templates,g++,C++,Templates,G++,我们可以证明第二个使用的代码如下 ////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).nam
////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;
}
///head.h
#如果没有温度
#定义温度
#包括
#包括
模板
课堂测试
{
公众:
测试(ti=0):val(i){
void getId()常量
{
std::cout第1个很简单。只需创建一堆不同的源文件,并在每个源文件中包含模板头,然后使用template类生成一些输出。然后分别编译每个源文件。现在使用调用它的主程序逐个链接它们。如果没有任何链接器错误,但程序会生成输出ut,这证明每个编译的对象文件都包含模板代码
<> P.S.额外的副本可能不会被删除,它们仍然可以作为可执行代码中的死代码存在。 < P>当然有些编译器不这样做。IBM C++编译器在链接时生成所需模板,然后编译它们,直到重复过程。我不确定您最初的假设,但是您可以尝试运行< COD。e> nm
在每个本应实例化模板的对象文件上,可能…?您实际的编程问题是什么?(这将如何改变您编写代码的方式?)没有要求编译器以这种方式运行(有些不要求),但它不应影响您的代码。在对象文件中转储标识符列表(即在Windows上使用dumpbin)然后让链接器生成一个映射文件。比较结果,然后如果删除了重复项,您可以做出合理的假设。@CaptainObvlious是的,我尝试过。但是我们可以写一些代码来证明它吗?@CLS您当然可以写一些代码来证明它。谢谢。我知道这只是实现它的一种方式,所以我只想知道如何证明它这种情况下,编译器在编译时做一些事情,但是如果我想编写一些代码来证明它,我必须得到可执行文件,但是它已经被链接了。这是我考虑的难点,为什么?它有什么区别?如果它膨胀了可执行文件,你可以从地图文件中发现它。如果没有,你只有PA的代价。id是一个小编译时间。@NeilKirk我不明白。