繁体   English   中英

什么是内在函数?

[英]What are intrinsics?

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

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

一个常见的例子是strncpy()

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

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

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

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

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

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

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

 mov ecx, 10
 xor eax, eax
 mov edi, offset FLAT:array1
 rep stosb

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

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

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

“内在函数”是编译器识别和实现的语言的那些特性,而不需要程序来声明它们。 编译器可能或可能不链接到运行时库以执行操作。 例如,在C ++中,结构复制操作是隐式的:

struct {
    int  a;
    char b [100];
    long c [27];
} s, t;

...
s = t;   // this statement copies hundreds of bytes, likely with a rtl call

其他示例包括像Fortran这样的语言,其中隐含支持复杂类型,并且超越(正弦,切线等)函数不需要 - 也不能声明。 PHP,Javascript,Ruby等具有数百种内在函数,例如创建和搜索数组,执行正则表达式匹配等等。

至于你的其他问题,唯一的区别是它们是否需要申报。 例如,使用超越函数的C ++程序必须包含数学库声明:

#include <math.h>

没有特定的应用程序模式依赖于内在函数; 这对编译器编写者和程序员来说只是一个重要的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM