我正在尝试使用汇编代码 - ARMv7-a来实现C ++函数,具体而言。 现在我遇到一个我不知道C ++函数模板应该是什么的程序 在汇编中实现。我尝试使用-S -O1标志编译源代码以查看 生成的程序集但无法理解它。任何人都可以给我一个简短的想法 C ++模板被翻译成汇编代码?只需使用以下简单功能即可 举个例子:
template<typename T>
T f(T a) {
return a + 1;
}
如果您发现任何其他功能更容易解释,请执行此操作。谢谢!
答案 0 :(得分:9)
正确地说出来会有所帮助。它不是模板功能,它的功能模板 ...注意到了差异?
模板,是在实例化时生成代码。因此,在这种情况下,如果您为f
实例化int
,那么程序集将与
int f(int a) { // Note that having a return type void is wrong here
return a + 1;
}
缺少非实例化模板的二进制代码生成。这就是为什么在执行有问题类型的实例化之前,模板代码中的许多错误仍然处于休眠状态的原因。
因此,对于一个真实的例子,这里有两个版本,一个是函数模板生成的,另一个是函数生成的(都是int
);如果它没有正确的提示,则不能告诉差异:
f2(1);
00BA25BE push 1
00BA25C0 call f2<int> (0BA12F3h)
00BA25C5 add esp,4
f(1);
00BA25C8 push 1
00BA25CA call f (0BA12EEh)
00BA25CF add esp,4
有关模板(此次输入的类型)和二进制代码表示here
的更多信息答案 1 :(得分:6)
您应该在单独的程序集中实现模板的每个实例。
从根本上说,每个模板实例都是不同的类型。你还需要处理专业化问题;部分或其他。
(当然这意味着你需要提前知道你需要哪组T
,但这基本上就是C ++编译器所做的。)