【发布时间】:2020-07-05 02:26:37
【问题描述】:
我刚刚了解到 inline 使我的代码在处理函数时更快,但我想知道为什么我们不只内联每个函数,以正常方式编写函数有什么意义,为什么我们有这么强大的关键字(我知道编译器选择是否内联函数,但建议内联每个函数会更好)?
plus:使用 Clion 我试图内联以下函数,但出现错误:
#include <stdio.h>
#include <time.h>
inline double maxf(int a,int b)
{
if (a>b)
return a;
return b;
}
int main() {
clock_t begin = clock();
double arr[999999]={0};
double max=arr[0];
arr[9898]=99999999;
for (int i=1;i<999999;i++)
{
max=maxf(arr[i],max);
}
clock_t end = clock();
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("%lf",time_spent);
return 0;
}
[ 50%] Building C object CMakeFiles/untitled.dir/main.c.o
[100%] Linking C executable untitled
Undefined symbols for architecture x86_64:
"_maxf", referenced from:
_main in main.c.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [untitled] Error 1
make[2]: *** [CMakeFiles/untitled.dir/all] Error 2
make[1]: *** [CMakeFiles/untitled.dir/rule] Error 2
make: *** [untitled] Error 2
对导致此问题的原因有什么想法吗?
【问题讨论】:
-
如果你这样做了,它可能会使你的程序大小成倍增加。想象一下,如果你多次调用一个大函数,它是
inlined。 -
a和b应该是doubles。double maxf(int a,int b) -
编译器没有有 无论如何都会生成函数
inline。关键字是这样做的邀请。 “6.7.4.5 将函数设为内联函数建议尽可能快地调用函数。此类建议的有效程度由实现定义。” -
内联并不总是使代码更快。
-
关于:
arr[9898]=99999999;由于数组arr[]是一个由double值组成的数组,因此文字:99999999也应该是双精度数。建议:arr[9898]=99999999.0;
标签: c compilation c-preprocessor inline c99