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

Why on many drivers, the return value of functions is handled with variables?

我在很多驱动代码中看到像

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

在可能的情况下直接 return 输入值或转到时,不能更快地处理吗?这样你就可以保存 return 值的 space 和你至少需要做的 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_THAT_IS_FINE 的相同代码。这是因为任何质量正常的编译器都会为代码构造一个流程图。无论代码是否在嵌套结构深处有一个 return 语句,或者只是脱离了嵌套结构,接下来执行的是函数中的 return。即使使用赋值语句,编译器也会看到 retval 仅用于 return 函数中的值,因此编译器会优化赋值 - 它只会将值放在适当的位置从函数中 return 它而不是实际将它写入分配给 retval.

的单独内存

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

软件变得越来越复杂,人类在处理复杂代码时很容易出错。减少错误的一种方法是创建可遵循的规则模式。如果我们找出有效的模式,并在编写代码时遵循这些模式,那么我们就可以在编写或修改代码时减轻对分析所有代码的需求——我们可以遵循模式而不是追溯所有代码在我们的脑海中多次编码以弄清楚。编程并不要求我们遵循模式,但使用模式是一种让我们的工作更轻松或更好的工具。

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

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