我想知道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 是检查我们是否要对目录做某事的函数,从中调用系统调用。
最佳答案
这叫做 tail-call优化(它未在任何 C 标准中指定;相比之下,某些语言 - 例如 Scheme 和 Ocaml - 指定需要进行尾调用优化)。在一些案例中,最近GCC编译器可以做到这一点 optimization .
但这实际上取决于细节,特别是传递给 call_func
如果您依赖它,请注释您的代码并使用 gcc -fverbose-asm -O2 -S
检查您的编译器是否这样做。
请注意,此优化不是必需的,可能是编译器、编译标志、处理器和 ABI具体。
(所以它可以在 x86-64 上工作,但不能在 32 位 ia32 或 ARM 上工作;你真的应该检查一下!)
关于c - GCC 返回优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26868267/