有人能解释一下它们是什么以及我为什么需要它们吗?如果需要使用内部函数,我将构建什么样的应用程序?
内部函数由编译器公开为不属于任何库 本质上的函数。
你可能会用得最多的是 程序集内部结构,它被编译器精确地视为它们所代表的指令。例如,在需要利用编译器不会自动生成的特定 CPU 指令的代码中,以及不一定需要完整的内联汇编部分时,可以使用它们。
通常,“ intrinsics”指的是内置的函数——即编译器可以/将内联生成的大多数标准库函数,而不是调用库中的实际函数。例如,像: memset(array1, 10, 0)这样的调用可以为 x86编译为:
memset(array1, 10, 0)
mov ecx, 10 xor eax, eax mov edi, offset FLAT:array1 rep stosb
这样的内部函数纯粹是一种优化。“需要”内部函数很可能是这样一种情况: 编译器支持内部函数,使您可以生成编译器不能(或通常不会)直接生成的代码。举个明显的例子,很多 x86的编译器都有“ MMX 内部特性”,可以使用“函数”,这些函数实际上只是 MMX 指令的直接表示。
内部函数是编译器在可能的情况下直接实现的函数,而不是链接到库提供的函数实现的函数。
一个常见的例子是 strncpy()。
strncpy()
对于短字符串,对 strncpy()进行函数调用(包括设置带有返回地址的“堆栈帧”)将比实际复制字节消耗更多的时间。更糟糕的是,对 CPU 预取缓冲区的影响将使 CPU 执行延迟几个时钟周期。
相反,内部函数是由编译器实现的,而不是函数调用。在 strncpy()的示例中,字节复制代码直接在调用 strncpy()的位置发出。
与此 strncpy()示例类似,如果满足所需的约束,则每个内部函数都直接作为内联代码实现。
在需要函数地址的情况下,内部函数的非内部副本通常仍然存在于标准库中。
与内联函数相比,内部函数由编译器提供。在 C 程序的源代码中没有写入内部函数的地方,也没有必须链接到的库实现。内联函数的不同之处在于,编译器读取内联函数的源代码,但类似之处在于,后来它可能直接将内联函数的编译转换发送到目标代码中,省略了函数调用的开销。
简而言之,内部函数和内联函数的实际区别在于,即使没有包含函数声明的 #include头文件,内部函数也是“存在的”。对于内联函数,带有函数声明的头文件必须首先是 #include’d (或以其他方式声明)。
#include
“内部特性”是一种语言的特性,编译器可以识别并实现这些特性,而不需要程序来声明它们。编译器可以(也可以不)链接到运行库来执行操作。例如,在 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>
没有依赖于内部特性的特定应用程序模式; 这只是编译器编写者和程序员的一个重要问题。