Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何证明在C+中编译模板时+;,编译器创建多个副本,并在链接时删除副本 如何证明在C++中编译模板时,编译器在每个编译单元中生成一个实例化,然后链接器抛掉所有其中一个[CAMDMODEL模型]; 所以有两件事我们应该证明 1.创建多个副本2.链接时删除副本_C++_Templates_G++ - Fatal编程技术网

如何证明在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我不明白。