因此,我正在对编译器进行一些试验(我在 C++ 的“职业生涯”中已经到了那个地步),我注意到一个调用_rotl
被直接编译/汇编;我的意思是,不是程序集执行 a call
,而是(尽管只有 2 个)操作码似乎直接剪切/粘贴到调用所在的位置。
这背后的原因是什么?我相信这个词是“内联函数”,但我可能弄错了。
因此,我正在对编译器进行一些试验(我在 C++ 的“职业生涯”中已经到了那个地步),我注意到一个调用_rotl
被直接编译/汇编;我的意思是,不是程序集执行 a call
,而是(尽管只有 2 个)操作码似乎直接剪切/粘贴到调用所在的位置。
这背后的原因是什么?我相信这个词是“内联函数”,但我可能弄错了。
它不是一个内联函数,它是一个内在函数。旨在利用目标处理器的特定功能。它无条件地内联,并且没有以其他方式声明函数内联,通常只产生一条机器代码指令。在 _rotl() 的情况下,使用 x86 ROL 指令。
C++ 中的inline
关键字建议编译器将某些函数(通常很短)内联,以减少call
汇编命令(处理器指令)造成的开销。
但是,这只是一个建议,因此其他未明确标记的短函数inline
也可以内联,并且它也可以忽略您的内联请求,尤其是在函数非常大的情况下。
内联操作本身基本上将函数的主体复制到它使用的每个地方,而无需调用它。
你可以随时用谷歌搜索它并找到更多信息。
编辑:内联通常仅/主要在优化打开时发生;尝试打开和关闭它们并比较反汇编。
内联是为了提高效率而进行的。call
首先,它通过实质上插入函数“内联”来节省 a 的成本。也就是说,制作该函数的副本并将其插入到最初调用的位置。其次,由于空间局部性,要执行的代码更靠近,这有助于缓存。
如果函数在循环中被调用,则通常是内联的,在这种情况下,这种开销变得更加重要。您可以使用inline
关键字向编译器提示您希望内联函数,但编译器没有义务这样做。您有时可以使用编译器特定的关键字来强制内联。例如,__forceinline
使用 VC++。