0

如何证明在 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 并获得结果

但是我们可以写一些代码来输出一些东西来证明吗?

4

2 回答 2

0

1号很容易。只需创建一堆不同的源文件并在每个源文件中包含模板头,然后使用模板类生成一些输出。然后分别编译每个源文件。现在将它们与调用它的主程序一一链接。如果您没有收到任何链接器错误,但程序会生成输出,则证明每个编译的目标文件都包含模板代码。

PS 额外的副本可能不会被消除,它们可能仍然作为死代码存在于可执行文件中。

于 2013-06-12T03:00:52.927 回答
0

一些编译器肯定不会那样做。IBM C++ 编译器在链接时生成所需的模板,然后在重复直到关闭过程中编译它们。

于 2013-06-12T03:10:22.593 回答