Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GCC返回优化_C_Linux_Gcc_Linux Kernel_Kernel Module - Fatal编程技术网

GCC返回优化

GCC返回优化,c,linux,gcc,linux-kernel,kernel-module,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); } } 如果我在else分支调用中,func的调用会像没有foo调用一样执行吗?我正在编写内核模块,为了解决一个特殊问题,我需

我想知道GCC是否可以优化如下代码

int foo(args) {
    if(is_true) {
        do_smth;
        n = call_func(args);
        do_smth;
        return n;
    }
    else {
        return call_func(args);
    }
}
如果我在else分支调用中,func的调用会像没有foo调用一样执行吗?我正在编写内核模块,为了解决一个特殊问题,我需要它看起来像是直接调用了call_func。更具体地说,call_func是一些系统调用。Foo是这个系统调用的我的版本。在这种情况下,我应该执行smth,调用这个系统调用,然后返回它的返回值。但是在里面!是真的吗?我想以某种方式更改调用堆栈本身-以便在当前级别上有call_func而不是foo。有可能吗

执行以下各项是正确的:

struct task_struct * cur_task = current;
if(check_dir(cur_task)) {
...
}
check_dir是一个函数,用于检查是否要对调用系统调用的目录执行某些操作

这称为优化(在任何C标准中都没有规定;相反,一些语言(如Scheme和Ocaml)规定需要进行尾部调用优化)。在某些情况下,最近的编译器可以做到这一点

但这实际上取决于细节,特别是传递给
call\u func

如果您依赖它,请注释您的代码,并使用
gcc-fverbose asm-O2-S
检查您的编译器是否正在这样做

请注意,此优化不是必需的,可能是编译器、编译标志、处理器和特定的


(因此它可以在x86-64上工作,但不能在32位ia32或ARM上工作;您真的应该检查!)

这取决于
是如何定义/实现的-您可能能够实现某种类型的调度程序,但您需要提供有关如何执行此测试及其基于什么的更多详细信息。我添加了实现。或者需要更详细的解释?比如@PaulR提到的a。第一次将函数指针设置为
foo
,之后它指向
call\u func
。如果需要,您可以稍后再次更改函数指针以指向
foo
。@Zboson这不是解决我问题的方法。问题是在卸载内核模块后删除代码。某些系统调用仍然可以执行(如可阻止读取)。在它被执行之后,它跳回我的实现,但不再有代码了,因为进程的虚拟内存已经被释放了。事实上,我正在为几个系统调用执行它,所以参数取决于特定的系统调用。系统的稳定性取决于它。若我能像这样优化,我将能够卸载模块,若我不能,我不会。