gpt4 book ai didi

c - Windows 需要同时执行内联和非内联函数。为什么?

转载 作者:太空狗 更新时间:2023-10-29 16:08:11 25 4
gpt4 key购买 nike

我编写了一个自定义 C 代码,其中包含 main 和另一个由 main 调用的函数。我多次执行此功能(~100 万)。在一段代码中,我将此函数声明为 __inline,而在另一段代码中,我将其声明为 __declspec(noinline)。我使用 WinDBG 监视反汇编,发现后者像普通函数调用一样使用 push pop 和分支,而前者不使用此类指令并正确内联函数。但是他们两个的时间完全一样。以下是代码: (在 A9 cortex CPU (Tegra 3) 上执行此代码)

__inline int multifunc(int a, int b);

int main(int argc, char **argv) {

unsigned long int timeBefore, i;
unsigned long int timeAfter;
unsigned int a[11500], j, k, l;
double elapsed;
timeBefore = GetTickCount();
printf("\n%ld", timeBefore);


for(l=1; l<300;l++)
{
for(i=0; i<11500; i++)
{
j = i+l;
k=1;
a[i] = multifunc(j, k);
}

}
printf("\n%ld", timeBefore);
timeAfter = GetTickCount();

printf("\n%ld", timeAfter);


return -1;
}

__inline int multifunc(int a, int b)
{
int d;
d = a+b;
printf("%d", d);
return d;
}

谁能解释一下为什么?我为第二次测试所做的更改是将 __inline 更改为 __declspec(noinline)。

最佳答案

printf() 调用非常昂贵。函数调用时间与执行 printf() 所需的时间相比相形见绌。

实证检验

printf() 比函数调用慢多少?你不会得到相同的结果。我正在使用 Linux、X11 和 xterm。

109 个函数调用

__attribute__((noinline))
static int function(int x)
{
return x;
}
int main(int argc, char *argv[])
{
int i, a = 0;
for (i = 0; i < 1000000000; i++)
a += function(i);
return a;
}

105 printf()

#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
for (i = 0; i < 100000; i++)
printf("%d\n", i);
return 0;
}

结果

我系统上的挂钟时间显示 printf() 程序花费的时间是调用函数的程序的 7.6 倍,这意味着 printf() 花费 76,000函数调用的时间。将内联决定留给您的编译器。

关于c - Windows 需要同时执行内联和非内联函数。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15402392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com