C 为什么在许多驱动程序上,函数的返回值是用变量处理的?

C 为什么在许多驱动程序上,函数的返回值是用变量处理的?,c,linux-kernel,kernel-module,C,Linux Kernel,Kernel Module,我在很多司机身上看到类似的代码 static rettype fun(argtype arg) { rettype ret; // do some stuff and change ret accordingly return ret; } 当直接返回值或在可能的情况下继续时,不能更快地处理吗?这样可以节省返回值的空间,并为ret分配至少需要执行的操作。我很困惑,每一个帮助都会很好。谢谢。一般来说,代码结构看起来很复杂,并且嵌套了如下结构: Calculate some

我在很多司机身上看到类似的代码

static rettype fun(argtype arg) {
    rettype ret;
    // do some stuff and change ret accordingly
    return ret;
}

当直接返回值或在可能的情况下继续时,不能更快地处理吗?这样可以节省返回值的空间,并为ret分配至少需要执行的操作。我很困惑,每一个帮助都会很好。谢谢。

一般来说,代码结构看起来很复杂,并且嵌套了如下结构:

Calculate some things, look up some things.
if (one thing)
{
    Get some more things.
    if (another thing)
        …
}
else
{
    Get different things.
    if (that thing)
        …
    else
        …
            …
                if (yet another decision)
                    retval = SURE_THAT_IS_FINE;
                else
                    …
            …
        …
    …
}
将完全等同于相同的代码,并将
retval=
替换为
return SURE\u确保\u正常
。这是因为任何具有正常质量的编译器都会构造代码流图。无论代码在嵌套结构的深处有一个
return
语句,还是仅仅从嵌套结构中掉出来,接下来执行的就是函数的返回。即使使用赋值语句,编译器也会看到
retval
仅用于从函数返回值,因此,编译器将优化赋值,它只是将值放在适当的位置,以便从函数返回,而不是将其实际写入分配给
retval
的单独内存中

因此,就编译器和生成的代码而言,这两种选择之间没有区别。那我们为什么要挑一个呢

软件变得越来越复杂,人类在处理复杂代码时容易出错。减少错误的一种方法是创建要遵循的规则模式。如果我们找到了有效的模式,并且在编写代码时遵循了这些模式,那么我们就不再需要在编写或修改代码时分析所有代码,我们可以遵循这些模式,而不是在脑海中反复寻找所有代码来解决它。编程不需要我们遵循模式,但使用模式是一种使我们的工作更容易或更好的工具

在这种情况下,驱动程序开发人员可能已经建立了一种始终分配
retval
并一直到驱动程序例程结束的模式。在某些驱动程序中,
返回之前可能有一些最终处理代码。例如,可能存在释放已分配资源的代码,或者在返回错误代码时触发某些事情的代码。即使在您查看的特定驱动程序中没有此类代码,也可能在其他驱动程序中存在。并且遵循始终贯穿到例程末尾的模式,而不是直接返回,目的是确保始终执行最终处理代码,而不是绕过它


这只是一个例子。使用此模式可能还有其他原因。

通常,代码结构看起来很复杂,并且嵌套了以下结构:

Calculate some things, look up some things.
if (one thing)
{
    Get some more things.
    if (another thing)
        …
}
else
{
    Get different things.
    if (that thing)
        …
    else
        …
            …
                if (yet another decision)
                    retval = SURE_THAT_IS_FINE;
                else
                    …
            …
        …
    …
}
将完全等同于相同的代码,并将
retval=
替换为
return SURE\u确保\u正常
。这是因为任何具有正常质量的编译器都会构造代码流图。无论代码在嵌套结构的深处有一个
return
语句,还是仅仅从嵌套结构中掉出来,接下来执行的就是函数的返回。即使使用赋值语句,编译器也会看到
retval
仅用于从函数返回值,因此,编译器将优化赋值,它只是将值放在适当的位置,以便从函数返回,而不是将其实际写入分配给
retval
的单独内存中

因此,就编译器和生成的代码而言,这两种选择之间没有区别。那我们为什么要挑一个呢

软件变得越来越复杂,人类在处理复杂代码时容易出错。减少错误的一种方法是创建要遵循的规则模式。如果我们找到了有效的模式,并且在编写代码时遵循了这些模式,那么我们就不再需要在编写或修改代码时分析所有代码,我们可以遵循这些模式,而不是在脑海中反复寻找所有代码来解决它。编程不需要我们遵循模式,但使用模式是一种使我们的工作更容易或更好的工具

在这种情况下,驱动程序开发人员可能已经建立了一种始终分配
retval
并一直到驱动程序例程结束的模式。在某些驱动程序中,
返回之前可能有一些最终处理代码。例如,可能存在释放已分配资源的代码,或者在返回错误代码时触发某些事情的代码。即使在您查看的特定驱动程序中没有此类代码,也可能在其他驱动程序中存在。并且遵循始终贯穿到例程末尾的模式,而不是直接返回,目的是确保始终执行最终处理代码,而不是绕过它


这只是一个例子。使用此模式可能还有其他原因。

请提供一个更具体的示例,“直接返回值”是什么意思?谁说这两种方法都可以节省空间,编译器使用寄存器来实现这些功能?您总是直接返回一个值。通常在设置和返回
ret
之间需要处理一些资源管理-这是使用变量而不是某种常量的常见原因。有时,返回值本身就是函数调用的结果;这可能是
返回函数(args)
ret=函数(args)和以后的
返回ret。这种差异不太可能是可测量的,也不显著。对于性能,还有其他更大的问题需要担心。另一个因素我