c - GCC 返回优化

标签 c linux gcc linux-kernel kernel-module

我想知道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/

相关文章:

c - 在 C 中使用套接字的段错误的未知原因

linux - 如何使用静态 IP 地址设置主机和 httpd.conf 文件

linux - 从 dd 损坏的分区恢复数据

r - 错误 : Could not find build tools necessary to build

c - #define 应该在宏周围添加空格吗?

c - 解析中间有 2 个操作数和 1 个运算符的简单数学方程

c++ - 我可以访问 Unity 背景元素吗?

c - 互斥锁内的信号量等待

linux - 在 Linux 中使用模式创建具有给定大小的大文件

c - 为函数参数指定寄存器?