为什么要包装函数?

晴空塔

为什么 Linux 内核有时会实现一个函数的多个版本,它们的名称非常相似,只是包装了另一个函数?例如,这里

static void clocksource_select(void)
{
    __clocksource_select(false);
}

static void clocksource_select_fallback(void)
{
    __clocksource_select(true);
}
沙迦·舍梅什

你举的例子不是很好的例子,因为它与Linux内核无关。这只是基本的软件工程。

当您有两个功能需要非常接近的功能时,您可以采用多种方法。

  1. 您可以实现该功能两次。我们不喜欢这样做,因为它会造成代码重复。这也意味着,如果您需要更改代码公共区域的某些内容,则需要记住在两个地方进行更改。

  2. 您可以将公共代码拆分为自己的函数,并从每个函数中调用该函数。如果可能,那是最好的解决方案问题是这并不总是可能的。这可能是不可能的,因为公共代码需要太多上下文,或者因为它需要分布在整个函数中。这使我们有权:

  3. 创建一个内部“通用”函数,并带有一个参数,告诉您要提供哪些功能。只需编写代码,并if在两个函数需要做不同的事情地方放一个这是内核在您的示例中采用的路径。

话虽如此,还有另一种情况,特定于 Linux 内核,其中两个功能似乎确实几乎相同。在i386平台上,stat系统调用不是两次,而是三次:

  • oldstat 系统调用号 18
  • stat 系统调用号 106
  • stat64 系统调用号 195

这样做的原因是 Linux 内核承诺通过其用户空间内核接口完全向后兼容。当一个函数由于某种原因必须被取代时,发生的stat不是一次,而是两次(如果算上三倍fstatat),则需要保留旧的系统调用条目并保持可操作性。

但是,如果您查看实际实现,您会注意到它们之间几乎没有区别,并且它们最终都调用了几乎相同的函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Yocto:为什么要包括包装?

来自分类Dev

为什么要传入函数?

来自分类Dev

为什么要调用python装饰函数?

来自分类Dev

为什么要调用构造函数?

来自分类Dev

为什么要调用此函数?

来自分类Dev

为什么要调用移动构造函数?

来自分类常见问题

为什么这个包装函数的调用比常规函数快?

来自分类Dev

在Python C API中,包装函数为什么是静态的

来自分类Dev

Javascript为什么在IIFE中包装变量或构造函数?

来自分类Dev

为什么Coffeescript Transpiler会使用“ call”调用包装函数?

来自分类Dev

为什么将JavaScript函数包装为匿名

来自分类Dev

为什么必须用匿名函数包装回调?

来自分类Dev

为什么iife中的包装函数会导致弱类型?

来自分类Dev

为什么我的函数声明包装为2行?

来自分类Dev

在Python C API中,包装函数为什么是静态的

来自分类Dev

为什么Object.create比构造函数要慢得多?

来自分类Dev

为什么要声明空的javascript函数,然后添加属性

来自分类Dev

为什么要调用内部函数而不是方法?

来自分类Dev

Metal为什么要编译此递归函数?

来自分类Dev

在Python中,何时/为什么要返回函数?

来自分类Dev

为什么要令牌?

来自分类Dev

为什么要打印?

来自分类Dev

为什么要麦迪逊?

来自分类Dev

为什么要串联?

来自分类Dev

为什么要调用?

来自分类Dev

为什么要令牌?

来自分类Dev

为什么要内联?

来自分类Dev

为什么UnderscoreJS具有许多原生Javascript函数的包装函数?

来自分类Dev

为什么函数包装没有在JavaScript中未调用的函数对象