什么是内在函数?

Sco*_*t J 52 c c++ intrinsics

任何人都可以解释它们是什么以及为什么我需要它们?如果我需要使用内在函数,我将构建什么样的应用程序?

Hea*_*utt 55

内部函数是编译器在可能的情况下直接实现的函数,而不是链接到库提供的函数实现.

一个常见的例子是strncpy().

对于短字符串,进行函数调用strncpy()(涉及设置带有返回地址的"堆栈帧")将比实际的字节复制消耗更多的时间.更糟糕的是,对CPU预取缓冲区的影响将使CPU执行停顿几个时钟周期.

相反,内部函数由编译器实现,而不是函数调用.在示例中strncpy(),字节复制代码直接在strncpy()调用的位置发出.

与此strncpy()示例类似,如果满足所需的约束,则每个内部函数都直接实现为内联代码.

内部函数的非内在副本通常仍然存在于标准库中,以防需要函数的地址.

与内联函数相比,内部函数由编译器提供.在C程序的源代码中没有写入内部函数的地方,也没有必须链接到的库实现.内联函数的不同之处在于编译器读取内联函数的源代码,但类似之后,它可以将内联函数的编译转换直接发送到目标代码中,省略函数调用的开销.

简而言之,内部函数和内联函数之间的实际区别在于,即使您没有#include包含函数声明的所需头文件,内部函数也会"存在" .对于内联函数,带有函数声明的头文件必须首先是#include'd(或以其他方式声明).


Jer*_*fin 41

通常,"内在函数"指的是内置函数 - 即大多数标准库函数,编译器可以/将生成内联而不是调用库中的实际函数.例如,像:memset(array1, 10, 0)这样的调用可以为x86编译,如:

 mov ecx, 10
 xor eax, eax
 mov edi, offset FLAT:array1
 rep stosb
Run Code Online (Sandbox Code Playgroud)

像这样的内在函数纯粹是一种优化."需要"内在函数很可能是编译器支持内在函数的情况,这些内在函数允许您生成编译器无法(或通常不会)直接生成的代码.对于一个明显的例子,x86的很多编译器都有"MMX内在函数",它允许你使用"函数",这些函数实际上只是MMX指令的直接表示.


gre*_*ade 6

编译器将内在函数公开为不属于任何库的函数本身.

您可能最常使用的是汇编内在函数,它们被编译器视为它们所代表的机器指令.例如,您可以在需要利用编译器不自动生成的特定CPU指令的代码中使用它们,并且您不一定需要完整的内联汇编部分.