【问题标题】:Is there a compiler difference between an if-check and inline conditional?if-check 和 inline 条件之间是否存在编译器差异?
【发布时间】:2017-06-13 20:41:13
【问题描述】:

我最近开始使用标志来处理输入循环的有效性条件,以便可以在循环内的其他地方检查它,而不必多次重做相同的检查。但是,我不确定如何最好地分配标志。是否有关于此的一般标准做法,或者只是个人风格?编译后的代码有什么不同吗?

例如,代替下面的代码:

bool isValidSize;

do {
    std::cout << "Enter the font size (8-12): ";
    std::cin >> fontSize;

    if (fontSize >= MIN_FONT_SIZE && fontSize <= MAX_FONT_SIZE) {
        isValidSize = true;
    } else {
        isValidSize = false;
        std::cout << "Invalid size. ";
    }
} while (!isValidSize);

可以更改 if 语句,使isValidSize 设置的内容一目了然:

    isValidSize = (fontSize >= MIN_FONT_SIZE && fontSize <= MAX_FONT_SIZE);
    if (!isValidSize) {
        std::cout << "Invalid size. ";
    }

这会被编译为额外的 if-check 吗?将作业与其他任何东西分开是否有任何可移植性好处?仅从代码来看,似乎第一种方式的好处可能只是一个分支,但每个代表都有一个额外的分配,而且还有一个 else?

【问题讨论】:

  • 您可以在godbolt.org 轻松检查不同编译器使用不同优化选项生成的内容。但是,无论如何,在尝试优化之前,您应该对代码进行基准测试/分析,看看它是否重要 - 如果不重要,请始终编写最清晰的版本。
  • 这种微优化几乎总是愚蠢的。以对读者最有意义的方式写出来。让编译器完成它的工作。 Gcc 非常擅长优化这种情况。如果你很好奇,学习如何编译为汇编(简单)并看看自己会发生什么(有点难),这是一项有价值的技能。然后意识到没有两个编译器是相似的,包括相同编译器的版本。 @JesperJuhl 关于 godbolt.org 是对的。这很酷。
  • 在交互式输入循环中担心纳秒是没有意义的。使用你认为最易读的那个。
  • 对不起,我应该更清楚的。我不是在问一个是否会更优化。我同意微优化和预优化是万恶之源。 :) 我真的只是想知道编译器的行为是否真的存在差异,以及它们是什么。关于收益/比较,我唯一的问题是可读性以及是否有标准做法。我还是个学生,所以我一直在寻找更多的方法来获得比他们在学校教给我们的更成熟的代码。非常感谢上帝! :)
  • 使用你认为最易读的那个。最重要的是你不可读,但其他人可读。

标签: c++ if-statement g++ variable-assignment


【解决方案1】:

没有区别:proof

GCC 6.3 上进行了优化测试 (-O3)。

选择您认为更具可读性的内容。

【讨论】:

  • 谢谢!就一般实践的可读性而言,其中一个更标准,还是真的根本不重要?
  • @BrainFRZ 在这种情况下,它真的取决于。无论如何,恕我直言,我更喜欢第二个 sn-p。我觉得它更具可读性。
猜你喜欢
  • 1970-01-01
  • 2019-09-21
  • 2013-06-01
  • 2016-07-16
  • 2021-08-17
  • 2015-01-17
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
相关资源
最近更新 更多