1

因此,我正在对编译器进行一些试验(我在 C++ 的“职业生涯”中已经到了那个地步),我注意到一个调用_rotl被直接编译/汇编;我的意思是,不是程序集执行 a call,而是(尽管只有 2 个)操作码似乎直接剪切/粘贴到调用所在的位置。

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

4

3 回答 3

6

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

于 2012-05-19T15:35:19.040 回答
1

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

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

内联操作本身基本上将函数的主体复制到它使用的每个地方,而无需调用它。

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

编辑:内联通常仅/主要在优化打开时发生;尝试打开和关闭它们并比较反汇编。

于 2012-05-19T15:24:55.167 回答
1

内联是为了提高效率而进行的。call首先,它通过实质上插入函数“内联”来节省 a 的成本。也就是说,制作该函数的副本并将其插入到最初调用的位置。其次,由于空间局部性,要执行的代码更靠近,这有助于缓存。

如果函数在循环中被调用,则通常是内联的,在这种情况下,这种开销变得更加重要。您可以使用inline关键字向编译器提示您希望内联函数,但编译器没有义务这样做。您有时可以使用编译器特定的关键字来强制内联。例如,__forceinline使用 VC++。

于 2012-05-19T15:28:35.767 回答