如何在汇编中实现C ++函数模板?

时间:2014-05-28 16:13:19

标签: c++ assembly

我正在尝试使用汇编代码 - ARMv7-a来实现C ++函数,具体而言。 现在我遇到一个我不知道C ++函数模板应该是什么的程序 在汇编中实现。我尝试使用-S -O1标志编译源代码以查看 生成的程序集但无法理解它。任何人都可以给我一个简短的想法 C ++模板被翻译成汇编代码?只需使用以下简单功能即可 举个例子:

template<typename T>
T f(T a) {
   return a + 1;
}

如果您发现任何其他功能更容易解释,请执行此操作。谢谢!

2 个答案:

答案 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 ++编译器所做的。)