C语言中未使用函数的影响

时间:2014-02-26 00:17:45

标签: c

我用C编写了一个程序,它有几个不同版本的某个函数。我根据硬件考虑选择使用哪一个,并在编译之前更改我对此函数的单个调用。我通常也会去评论未使用的功能。但我想知道留下他们没有注释的效果是什么。

在我看来,如果他们从未被召唤,他们根本不会对执行时间产生任何影响。但是它们会增加可执行文件的大小。因为可执行文件的大小无论如何都不会让我感到烦恼。唯一重要的是执行时间,这是至关重要的。因此,似乎注释掉未使用的功能并不值得。我是对的吗?

3 个答案:

答案 0 :(得分:2)

如果使用优化和(MSVC)链接时间优化或(GCC / Clang)-flto进行编译,通常会删除未使用的函数,这使得它成为一个没有实际意义的点。

否则,未使用的函数往往对运行时性能影响很小,甚至可能为零。它们会增加可执行文件的大小,从而增加加载时间。

他们可以对性能产生任何非零的影响,导致其他紧凑的代码在内存中散布。如果代码库的很大一部分是未使用/无法访问的代码,这可能会变得明显。

使用编译器指令:

而不是“注释掉”例程
#define WINDOWS_x86 0
#define WINDOWS_x64 1
#define WINDOWS_ARM 2
#define LINUX_x86 3
#define LINUX_x64 4
#define LINUX_ARM
...

#if defined(WINDOWS_x86) || defined(WINDOWS_x64)
void doAThing() {
   ULONG x = 0;
   ...
}
#elif defined(WINDOWS_ARM)
void doAThing() {
    MessageBoxA("You too cheap to buy real computer. I no calculate for joo");
}
#elif defined(LINUX_x86)
...
#endif

答案 1 :(得分:1)

代码大小对执行速度很重要。
您可以让编译器简单地将代码省略为死代码:
如果仅从其自己的编译单元中调用该函数,则将static限定符添加到函数声明中可让编译器知道它不会从编译单元外部调用。如果编译器可以看到它没有从内部调用,它可以丢弃代码(并可能发出类似“未使用的函数”的警告)。
如果你有某种链接时优化,它可能能够在单独的编译单元中对代码执行相同的操作,但是编译时间要贵一些。

答案 2 :(得分:1)

好的,这是我计算机上的一些实际测试:

Test1.cpp:

int foo()
{
int x;
x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x; x = x % x;
}

int bar(void) {
return 0;
}

int main() {
    bar();
    return 0;
}

测试2.cpp:

int bar(void) {
return 0;
}

int main() {
    bar();
    return 0;
}

测试10000次(测量的CPU周期):

Test1.cpp
0m6.044s
Executable size: 7,355 bytes

Test2.cpp
0m6.036s
7,331 bytes

总而言之,似乎可以实现小的性能提升但是我的结果可以忽略不计的低效率。但请记住,这没有任何内置库。我可以保证他们的代码比50模数操作更重。


第2部分:

Test3.cpp:

#include <stdio.h>
#include <stdlib.h>

int bar(void) {
return 0;
}

int main() {
    bar();
    return 0;
}

Test4.cpp:

int bar(void) {
return 0;
}

int main() {
    bar();
    return 0;
}

Test3.cpp:
0m5.960s
Executable size: 7331 bytes

Test4.cpp:
0m6.176s, 0m5.964s, 0m6.116s
Executable size: 7331 bytes

似乎编译器在处理这些事情方面做得很好。包含一些较大的库后,似乎它们已从文件中删除。