C ++编译器如何处理模板

时间:2014-05-12 21:26:50

标签: c++ templates

正如你们中的一些人可能从我最近的帖子中知道的那样,我正在攻读C ++考试,该课程的内容非常糟糕。我基本上不得不自学一切,所以请在这里忍受。

这是一个考试题目:

  

(i)解释C ++语言中定义的模板的概念。   一定要区分程序员做什么和做什么   编译器。

我目前的理由:

(i)模板允许函数或类使用泛型进行操作。这允许程序员有效地编程X功能一次,并且能够将此功能用于许多不同的数据类型,而无需多次重写应用程序或应用程序的部分。

我的问题是我不知道编译器如何处理模板的使用。

我不确定编译器在这个阶段做了什么,如果有人能够清除它会有所帮助。

3 个答案:

答案 0 :(得分:4)

假设您使用模板编写函数:

template <typename T>
void function(T t){
 doSomething();
}

对于你调用这个函数的每个数据类型,编译器只需用该数据类型替换'T',比如说'int'并生成代码就像你用'int'而不是'T'编写这个函数一样从一开始。 如果其他人同意,这可能是正确的(但不是完整的)答案。

答案 1 :(得分:4)

C ++中的模板是通过替换实现的。它不像Java泛型,只需键入检查涉及泛型类的代码,然后使用原始引用(类型擦除)编译它。

基本上,C ++为代码中使用的每个实际模板参数创建不同的类/方法。如果你有

template<typename T>
void myMethod(T t)
{
  //
}

在编译时发生的事情是为实际使用模板的每种类型编译不同的方法。如果您在myMethod(50)myMethod("foo")上使用它,那么该方法的两个重载版本将在运行时可用。直观地说,这意味着模板可以生成代码膨胀,但实际上,相同的表达性是通过更大的代码库获得的,没有可读性较低的模板,因此不是真正的问题。

所以他们背后没有黑魔法(如果你考虑元编程或部分专业化,那就好吧。)

答案 2 :(得分:2)

对于您创建的不同类型的对象的每个实例,或者在函数的情况下使用您使用的不同类型的参数,编译器只是在编译时生成重载版本。因此,如果你有像sort函数这样的模板函数并将该函数用于int和double数组,那么编译器实际上已经创建了两个函数:一个使用int而另一个使用double。这是我能给出的最简单的解释。希望它有用。