我正在尝试使用汇编代码(具体来说是ARMv7-a)来实现C++函数。现在我遇到了一个问题,我不知道如何在汇编中实现C++函数模板。我尝试使用-S -O1标志编译源代码以查看生成的汇编代码,但无法理解它。有人能简要说明一下C++模板如何转换为汇编代码吗?以下是一个简单函数的例子:
template<typename T>
T f(T a) {
return a + 1;
}
如果您发现其他函数更容易解释,请使用该函数。谢谢!
正确表述会有所帮助。它不是模板函数,而是函数模板...注意区别吗?
模板是在实例化时生成代码的。因此,在这种情况下,如果您将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
有关模板(这次是类型)和二进制代码表示的更多信息在这里
你应该在单独的程序集中实现每个模板实例。
从根本上讲,每个模板实例都是不同的类型。您还需要处理特化; 部分或其他方式。
(当然,这意味着您需要预先知道需要哪组T,但这基本上就是C ++编译器所做的。)
asm("#begin template")
,这样会在.s
文件中显示。 - Anycorn