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

chr*_*rds 3 c++ templates

你们中的一些人可能从我最近的帖子中知道我正在为 C++ 考试而学习,这门课的内容非常糟糕。我基本上必须自己自学一切,所以在这里请耐心等待。

这是一道考试题:

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

我目前的理由:

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

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

我不确定编译器在这个阶段做了什么,如果有人能解决这个问题会很有帮助。

Jac*_*ack 5

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

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

template<typename T>
void myMethod(T t)
{
  //
}
Run Code Online (Sandbox Code Playgroud)

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

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