内联函数调用推理

时间:2012-05-19 15:17:33

标签: c++ assembly disassembly

所以我正在尝试使用编译器(我在C ++'职业生涯'中的那一点)并且我注意到对_rotl的调用直接编译/汇编;通过这种方式,我的意思是代替执行call的程序集,(尽管只有2个)操作码似乎直接在调用的地方剪切/粘贴。

这背后的原因是什么?我相信这个术语是“内联函数”,但我可能会弄错。

3 个答案:

答案 0 :(得分:6)

它不是内联函数,而是intrinsic function。旨在利用目标处理器的特定功能。它无条件地内联,并且没有以其他方式声明函数内联,通常只生成一个机器代码指令。在_rotl()的情况下,使用x86 ROL指令。

答案 1 :(得分:1)

C ++中的inline关键字建议编译器内联某些函数(通常很短),以减少call汇编命令(处理器指令)引起的开销。

但是,这只是一个建议,因此其他未明确标记为inline的短函数也可以内联,并且它也可以忽略您的内联请求,尤其是在函数非常大的情况下。

内联操作本身基本上复制了函数的主体,无需调用它。

您可以随时谷歌搜索并找到更多信息。

编辑:内联通常仅在优化开启的情况下发生;尝试打开和关闭它们并比较拆卸。

答案 2 :(得分:1)

内联是为了提高效率。首先,它通过基本上插入函数'in-line'来节省call的成本。也就是说,制作该函数的副本并将其插入最初调用的位置。其次,要执行的代码更紧密,这有助于缓存,因为空间局部性。

如果在循环中调用函数,则通常会内联函数,其中此开销变得更加重要。您可以将inline关键字提示用于要内联函数的编译器,但编译器没有义务这样做。您可以使用特定于编译器的关键字来强制内联。例如,__forceinline与VC ++。

相关问题