【发布时间】:2012-04-20 10:55:11
【问题描述】:
在大多数情况下,如果我想在 C 中创建一个可选功能,我只需创建两个这样的函数:
#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();长?
标签: c function optimization gcc macros