gpt4 book ai didi

C:为什么 &= 比 = 更好?

转载 作者:行者123 更新时间:2023-12-04 10:46:53 28 4
gpt4 key购买 nike

我正在查看我继承的一些旧代码,我真的不喜欢某些地方的风格。我真的不喜欢它的外观的一件事是:

bool func() {
bool ret = true;

ret &= test1();
homemade_assert_like_function(ret == true);
ret &= test2();
homemade_assert_like_function(ret == true);

return ret;
}

我认为以下内容看起来更清晰:

bool func() {
homemade_assert_like_function(test1());
homemade_assert_like_function(test2());

return true; // just to keep the interface
}

然而,后者产生更多的汇编代码。毫不奇怪,如果我更改 &=从第一个例子到 =结果与 assert(test());相同,但仍然 &=似乎更好
  • 使用 &=(63 行 asm):https://godbolt.org/z/DJWoJw
  • 没有 &=(81 行 asm):https://godbolt.org/z/kisyR4
  • 与 =(81 行 asm):https://godbolt.org/z/CaZsNe

  • 对于所有三个示例,我将 gcc5.4 用于带有 -O2 的 mips,但如果我将 gcc 用于 pc,结果是相似的。如果我使用 -std=c++14(和更新的编译器)进行编译,这三个示例会生成相同的代码。

    任何人都可以向我解释这一点吗?只是我的测试代码真的很糟糕吗?

    编辑:
    我做了一个新的代码示例,修复了损坏的断言。它确实有一个有趣的副作用。现在大小差异要小得多,这向我表明优化器可以在 &= 中发挥作用。案件。

    https://godbolt.org/z/Vk6uoY

    正如已经多次指出的那样,示例代码有些混淆。但它显示的与我在真实代码中看到的相同 - 除了删除 &= 之外什么都没有改变。代码风格,使代码库增加。

    最佳答案

    此代码尝试使用快捷方式评估,但失败了。
    (代码有误)

    首先,让我展示一下它的含义:

    代码应该是:

    bool func() {
    bool ret = true;

    ret = ret && test1();
    homemade_assert_like_function(ret == true);

    ret = ret && test2();
    homemade_assert_like_function(ret == true);

    return ret;
    }

    重要的部分是如果 ret已经是 false ,表示结果失败,它甚至不会尝试评估表达式的第二部分! ( test1()test2() )。

    如果函数 test()有任何副作用,一旦 ret就不会运行标志表示失败。

    这对于经历一个漫长的多步骤过程( test1() ... testN() )非常有用,并且一旦单个步骤失败就不会做任何工作。

    现在,这段代码实际上在做什么,为什么?
    ret开头为 true ,一旦其中一个函数失败, ret 就会变为 false,并卡在 false 处(只要操作始终为 &=

    但是,与我上面写的不同,每个函数, test1() , test2() , testN() , 仍然可以运行(包括副作用),即使之前的测试已经失败!

    这与他们刚刚将代码编写为:
    bool func() {
    bool ret = true;

    ret = test1();
    homemade_assert_like_function(ret == true);
    ret = test2();
    homemade_assert_like_function(ret == true);

    return ret;
    }

    与您建议的代码最大的不同在于您的代码 总是 返回 true .你怎么能假设每次测试都成功了?应该允许代码返回 false当测试失败时。您从您的代码版本中删除了该功能。

    关于C:为什么 &= 比 = 更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59666116/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com