编译器如何处理模板?
C++ How do compilers handle templates
你们中的一些人可能从我最近的帖子中知道,我正在为c++考试学习,课程的内容非常糟糕。我基本上必须自学所有的东西,所以请原谅我在这里。
这是一个考试问题:
(i)解释c++语言中定义的模板概念。一定要区分程序员所做的和用户所做的编译器。
我现在的理由:
(i)模板允许函数或类使用泛型进行操作。这允许程序员一次有效地编写X功能,并且能够在许多不同的数据类型中使用该功能,而不必多次重写应用程序或部分应用程序。我的问题是我不知道编译器如何处理模板的使用。
我不确定编译器在这个阶段做什么,如果有人能澄清这将是有帮助的
c++中的模板是通过替换实现的。它不像Java泛型,只是对涉及泛型类的代码进行类型检查,然后使用原始引用(类型擦除)进行编译。
基本上,c++为代码中使用的每个实际模板参数创建一个不同的类/方法。如果你有template<typename T>
void myMethod(T t)
{
//
}
在编译时发生的情况是,为模板实际使用的每种类型编译不同的方法。如果您在myMethod(50)
和myMethod("foo")
上使用它,那么在运行时该方法的两个重载版本将可用。直观地说,这意味着模板可能会产生代码膨胀,但在实践中,没有可读性较差的模板,更大的代码库也能获得相同的表达性,所以这不是一个真正的问题。
所以它们背后没有黑魔法(如果你考虑元编程或部分专业化,就会有)。
假设你用模板写了一个函数:
template <typename T>
void function(T t){
doSomething();
}
对于调用该函数的每种数据类型,编译器简单地用该数据类型替换'T',说'int',并为其生成代码,就像您从一开始就用'int'而不是'T'来编写这个函数一样。如果别人同意的话,这可能是正确的(但不是完整的)答案。
对于您创建的不同类型的对象的每个实例,或者对于您使用的不同类型的参数的函数,编译器只是在编译时生成一个重载版本。所以如果你有一个模板函数,比如排序函数,并且用这个函数来处理int和double数组,那么编译器实际上已经生成了两个函数:一个使用int,另一个使用double。这是我能给出的最简单的解释。希望对大家有用。
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 处理未处理的异常更改C++
- 使用信号处理程序处理从 FIFO 接收的数据
- 使用QT的C 处理DOM处理后的XML属性顺序
- C++异常处理如何处理异常派生类
- 如何处理信号处理库的输入/输出类型