在Linux内核代码中使用goto没有意义[关闭]

问题描述 投票:0回答:2

我正在查看Linux源代码,而here偶然发现了此功能:

static int check_free_space(struct bsd_acct_struct *acct)
{
    struct kstatfs sbuf;

    if (time_is_after_jiffies(acct->needcheck))
        goto out;

    /* May block */
    if (vfs_statfs(&acct->file->f_path, &sbuf))
        goto out;

    if (acct->active) {
        u64 suspend = sbuf.f_blocks * SUSPEND;
        do_div(suspend, 100);
        if (sbuf.f_bavail <= suspend) {
            acct->active = 0;
            pr_info("Process accounting paused\n");
        }
    } else {
        u64 resume = sbuf.f_blocks * RESUME;
        do_div(resume, 100);
        if (sbuf.f_bavail >= resume) {
            acct->active = 1;
            pr_info("Process accounting resumed\n");
        }
    }

    acct->needcheck = jiffies + ACCT_TIMEOUT*HZ;
out:
    return acct->active;
}

我在Marco使用goto时没有多大意义,尤其是因为它导致了return语句。为什么不这样重写函数:

static int check_free_space(struct bsd_acct_struct * acct) {
  struct kstatfs sbuf;

  if (time_is_after_jiffies(acct->needcheck) ||
    vfs_statfs( &acct->file->f_path, & sbuf)) {
    //latter may block
    return acct->active;
  }
  if (acct->active) {
    u64 suspend = sbuf.f_blocks * SUSPEND;
    do_div(suspend, 100);
    if (sbuf.f_bavail <= suspend) {
      acct->active = 0;
      pr_info("Process accounting paused\n");
    }
  } else {
    u64 resume = sbuf.f_blocks * RESUME;
    do_div(resume, 100);
    if (sbuf.f_bavail >= resume) {
      acct->active = 1;
      pr_info("Process accounting resumed\n");
    }
  }
  acct->needcheck = jiffies + ACCT_TIMEOUT * HZ;
}

我被教导,如果goto用于打破嵌套循环或进行内存清理,则确实很有用。这里都不是这样,那么为什么马可(Marco)参加goto比赛呢?必须有某种正当的理由,对吧?

c linux-kernel goto
2个回答
4
投票

为什么不这样重写函数

您刚刚编写的函数为无效。更准确地说,如果未输入此块:

if (time_is_after_jiffies(acct->needcheck) ||
  vfs_statfs( &acct->file->f_path, & sbuf)) {
    vfs_statfs( &acct->file->f_path, & sbuf)) {
    //latter may block
    return acct->active;
}

然后该函数将无法在其他任何地方使用有效的return语句。该代码甚至无法编译。

goto在该特定功能中的用途是执行early return,而无需复制return acct->active;行。这是一种非常常见的模式,可以节省重复的代码行,有时还可以节省生成的可执行文件的大小。


0
投票

这是“单一收益”原则。一些程序员认为应该始终遵守。

如果将goto out;替换为return acct->active;,该功能将完全相同

这里是关于单笔收益的问题:Should a function have only one return statement?

© www.soinside.com 2019 - 2024. All rights reserved.