在大多数情况下,如果我想创建C中的可选功能,我只需创建两个函数是这样的:为什么GCC保留空功能?
#ifdef OPTIONAL_SOMETHING
void do_something(int n, const char *s)
{
while (n--) {
printf("%s", s);
}
/* ...You might get the point, really do something... */
}
#else
void do_something(int n, const char *s)
{
/* Empty body */
}
#endif
因此,如果符号未定义 - 当功能被禁用 - 一个空函数被编译成可执行文件。
钻研组装上市,似乎GCC编译并呼吁空函数时的优化是禁用。如果启用优化,也与-O2
和-O3
,只编译必要的堆栈处理代码,但它优化了调用指令。总而言之,它保持了这个功能。
大约同样适用于非空的,但未使用的方法。
它应该简单地扔掉整个事情,但事实并非如此。为什么这是默认行为?只是为了好奇:我如何消除这种情况?
“如果启用优化,同样使用-O2和-O3,它仅编译必要的堆栈处理代码,但它优化了调用指令。”这是否意味着这样还有一些开销? 'start_timer(); do_something(); stop_timer();'需要比'start_timer(); stop_timer();'更长的时间? – 2013-10-28 14:26:38