为什么LLVM-IR中没有显示模板函数
Why template functions do not show up in the LLVM-IR?
当从c++代码发出LLVM IR时,如果没有调用函数,为什么模板函数不会显示在LLVM-IR中,与llvm-ir中存在的其他类型的函数(int、float…)不同示例:以下函数func1
不显示在llvm ir 中
template <class tmp>
tmp func1 () {
// ...
}
但是这个函数func2
总是显示在llvm ir 中
int func2 () {
// ...
}
这是因为模板不是函数:它们是函数模板。在使用参数实例化之前,不会编译它们。例如,以以下代码为例:
template<typename T>
T foo() { /* ... */ }
这既不会输出任何代码。
但另一方面:
template<typename T>
T foo() { /* ... */ }
int test() {
return foo<int>();
}
将输出test
和foo<int>
的代码。
您也可以手动实例化这样的模板:
template int foo<int>();
这与C++模板的工作方式有关。因为编译器直到调用函数(或者更准确地说,当实例化它时)才知道tmp
是什么,所以它不知道如何为它编写代码
template <typename T>
T add(T left, T right) {
return left + right;
}
如果T
是一个整数,那么函数体就是一个整数加法。如果T
是一个双精度,那么它就是一个浮点加法。如果T
是std::string
,那么它就是对std::string::operator+
的函数调用。
由于任何C++程序中都有很多类型,而且其中许多类型都可以添加,而且几乎每种类型都是以不同的方式添加的,因此在知道这种类型之前,它无法为函数创建代码。如果它尝试对所有可能的类型T
执行此操作,您会得到可能实现的组合爆炸,几乎所有实现都从未使用过。您的编译时间和二进制大小将是巨大的,即使有任何好处,也是微不足道的。
使用类模板,事情会变得稍微复杂一些。类模板的实例化实际上不需要实例化所有未调用的函数。回到我们的例子,如果我们改为写:
template <typename T>
class Adder {
T add(T left, T right) {
return left + right;
}
};
Adder<int> a;
这个仍然不会实例化Adder<int>::add
,即使编译器已经掌握了所有信息来知道add<int>
可能很有趣,因为实际上并没有调用或以其他方式实例化它。
相关文章:
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- C++ 构造函数未显示输出
- 访问和打印元组中的数据,并使用 C++14 使用模板函数显示数据
- 分段故障 11,从类函数显示动态 C 字符串
- 函数显示( ) 不给出输出
- 如何使用消息框函数显示 BSTR 值
- 用于显示矩阵元素的C 函数显示垃圾值
- 函数显示输出和输入时出现问题
- 简单树插入节点函数显示为空
- 挂钩 winapi 函数显示我 dllimport 错误
- C++中的友元函数显示"variable or feild declared void error"
- 使用 main() 以外的其他函数显示类的对象,但在 main() 中调用;
- 我如何使用函数来计算并使用void函数显示
- 输入两个整数,并使用预定义函数显示最大数字
- 在界面设计中使用函数显示日期
- 我的函数显示垃圾,其他时候它显示干净的结果
- 使用函数显示直方图
- 为什么这个哈希表函数显示编译错误
- c++中友元函数显示错误
- 如何使用时间类和函数显示时间