我想知道GCC是否可以优化代码
int foo(args) {
if(is_true) {
do_smth;
n = call_func(args);
do_smth;
return n;
}
else {
return call_func(args);
}
}
所以,如果我在其他分支中调用call_func,那么就像没有foo调用一样执行调用?我正在编写内核模块,为了解决一个特定问题,我需要它看起来像是直接调用了call_func。更具体的说,call_func是一些系统调用。 Foo是我这个系统调用的版本。在is_true的情况下,我应该做smth,调用这个系统调用,然后返回它的返回。但是在!is_true我想以某种方式改变调用堆栈本身 - 所以在当前级别上有call_func而不是foo。它甚至可能吗?
is_true的实现:
struct task_struct * cur_task = current;
if(check_dir(cur_task)) {
...
}
check_dir是检查我们是否要对目录执行某些操作的函数,从中调用系统调用。
答案 0 :(得分:3)
这称为tail-call优化(在任何C标准中都指定 ;相反,某些语言-eg Scheme和Ocaml-指定需要进行尾调用优化)。在一些案例中,最近的GCC编译器可以执行optimization。
但这实际上取决于细节,特别是传递给call_func
如果您依赖它,请注释您的代码并与gcc -fverbose-asm -O2 -S
核对您的编译器正在执行此操作。
请注意,此优化不是必需的,可能是编译器,编译标志,处理器和ABI特定的。
(因此它可以在x86-64上运行,但不能在32位ia32或ARM上运行;你真的应该检查!)