func()
{
fun1();
fun2();
fun3();
fun4();
fun5();
fun6();
..
..
..
..
fun99();
fun100();
}
通过在C程序中使用函数指针?我需要在程序中反复调用这个程序。
答案 0 :(得分:7)
不确定这是否真的是优化,但您使用的函数指针如下:
#include <stdio.h>
static void fun1 (void) {
printf ("1\n");
}
static void fun2 (void) {
printf ("2\n");
}
static void fun3 (void) {
printf ("3\n");
}
static void (*fn[])(void) = {
fun1, fun2, fun3
};
int main (void) {
int i;
for (i = 0; i < sizeof(fn) / sizeof(*fn); i++) {
(fn[i])();
}
return 0;
}
输出:
1
2
3
正如所料。
你可以期待的最好的是main
可能稍微小一些,但是你需要函数表就可以抵消它。
它在“C如何工作?”中很有用。在现实世界中,有点但不那么有用。
当然函数指针本身很有用,我在C中使用它们做了相当多的状态机和面向对象的代码。只是这个具体的例子似乎是人为的。
如果您想连续执行它们,可以使用:
int main (void) {
int i = 0;
while (1) {
(fn[i])();
i = (i + 1) % (sizeof(fn) / sizeof(*fn));
}
return 0;
}
但是将for
循环包装在while (1)
内也是一样好。
答案 1 :(得分:6)
你为什么要这样做?
你想要优化什么?代码大小?运行?我会让编译器为我处理(可能暗示一些编译器选项)。
即使使用旧/慢处理器,低内存等进行嵌入式编程,我通常也不会尝试在代码级别进行优化,怀疑编译器可以更好地完成它(即使我放弃到汇编程序)
我更喜欢优化代码以提高可读性和可维护性。
一如既往,ymmv
答案 2 :(得分:3)
没有太多优化。您可以创建一个包含100个函数指针的初始化数组,并迭代它们。它可能会略微减少目标代码的大小,但不会太多,并且会比100次直接调用稍慢(但不是很多)。
void func(void)
{
static const void (*functions[])(void) =
{
fun1, fun2, fun3, ..., fun10,
...
fun91, fun92, fun93, ..., fun100
}
for (int i = 0; i < 100; i++)
(*functions[i])();
}
答案 3 :(得分:3)
如果funn
()函数中的任何一个很短,您可能会从having it inlined中受益。您需要查看编译器文档,看看它是否支持程序员有关内联函数的任何明确提示。我认为,有时仅仅使函数static
可以提供帮助。
当然,内联只会从实际函数调用中删除代码开销,这取决于函数,可能只占总运行时间的一小部分。
答案 4 :(得分:3)
使用函数指针不太可能为您提供速度优化。首先,您将添加100个指向函数的指针。其次,现在必须通过内存间接调用函数,这比直接调用要慢。第三,您的编译器将更难以进行函数内联。
性能受影响的具体细节取决于编译器和目标平台,但对于x86,除非函数采用相当多的相同参数,否则您实际上不希望使用函数指针路由。如果你想真正优化,为了可读性和速度,你需要重构。
如果我们假设32位x86和普通编译器,并且所有函数都不带参数,则在调用站点执行100次连续调用将占用500个字节,因为调用被编码为E8 +四字节eip相对目标偏移量。 / p>
转换为函数指针,你最终会得到一个占用400字节的指针表(这可能会被编码得更小,但由于我们没有被告知定义了funcNNN或编译器,我会假设100标准32位指针)。除此之外,您还需要代码来遍历指针数组并调用函数;此代码取决于您的编译器,Visual C ++ 2010生成的代码是16个字节。所以你节省了84个字节,但代价是执行速度。
如果不了解更多关于所调用的函数的信息,那就更难以评论了。
答案 5 :(得分:2)
此代码的性能很可能由每个函数的内容的执行主导,因此在此级别上很少或根本没有优化。一个明显的优化是将所有内容放在一个函数中;但这可能并不重要。
说实话;如果我看到这样的代码,我会在尝试优化执行之前询问有关设计的严肃问题。这并不是说有一个更好的解决方案,只是看起来异常,所以提出一个问题。
答案 6 :(得分:2)
cc -O3 ......................
将比任何人都更有效地优化它。
答案 7 :(得分:1)
如上所述它只是优化了main()中的代码大小和readbality,而不是任何实际的性能改进。我无法理解他真正想要什么样的优化。请澄清一下?