在优化方面,定义函数指针与参数和没有参数之间的区别是什么

时间:2012-12-26 17:43:49

标签: c function pointers

我知道以这种方式定义函数指针

struct handler_index {
    const char *name;
   int (*handler)();
};

允许对任何具有未指定(但非变量)数量和参数类型的函数使用处理程序指针。

但我想知道这个定义是否会影响代码或内存的优化或执行时间与此相比:

struct handler_index {
    const char *name;
    int (*handler)(int a, int b);
};

2 个答案:

答案 0 :(得分:2)

如果您想知道如何向函数指针添加更多参数会特别影响函数指针 - 它不会。无论参数的数量如何,函数指针都具有相同的大小。

如果您想知道调用这样的函数指针的效率:添加更多参数将导致生成代码以传递参数。所以,它会稍微影响调用的代码大小,也可能会影响执行时间,具体取决于CPU在传递这些args时可以拉出多少ILP。

现代调用约定通常会在寄存器中传递一些参数,因此您可能会或可能不会增加堆栈使用量。

要确切了解为每个调用生成的代码之间的区别,请阅读calling conventions(此处列出的内容太多了!)并检查代码生成的asm。但实际上,添加更多参数(在合理范围内)可能会产生如此微小的影响,这根本无关紧要。

答案 1 :(得分:0)

正如Cory所说,它是一个函数指针还是只是一个常规的基本函数并不是真正相关[除非常规函数被内联的情况,当然,函数指针通常不能 - 尽管情况如此特别是我已经看到编译器实际上弄清楚“啊,我们总是在这里调用函数X,所以让内联X” - 通常当函数指针是函数的参数时,而不是在结构中说。

通常会在函数调用中添加参数。处理器必须将这些参数放在某处,即使它们进入寄存器,也可能需要额外的指令才能将值输入RIGHT寄存器。

然而,你的第一个例子非常糟糕,因为没有检查你的代码是做正确的事。

此外,你需要一些漂亮的病态案例,以便在调用函数指针的过程中将参数传递给函数的开销很大 - 希望你的函数不仅仅是向另一个函数添加一个数字。

话虽如此,传递大量论据,特别是“难以获得”的论点可能非常糟糕。我正在研究一个图形芯片模拟器,而且像素处理器处理单元的一部分在其中间有一个调试打印,很少打印,但它需要7或8个参数(除了1000的调试级别或其他它是)。从相应的结构中取出那些参数并将它们粘在堆栈上需要花费相当长的时间,然后设置“if(debuglevel> = 1000)......”以便仅在实际需要时才进行调用,使得代码在该函数中快40%。