if-else 评估的顺序以及转发到各个分支 - 这重要吗,还是直接跳转?

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

我在这里使用了 C++ 语法和标签,但这种现象可以适用于任何编程语言。

这是关于条件分支的一个相当小众的方面,所以请耐心等待。 我知道一些类似的重复问题,但它们没有深入解决这一现象。

如果我们谈论机器级别,分支会立即发生。 当满足某个条件时,将采取一条执行路径,当满足该条件的否定时,将采取替代分支。为了进一步扩展这一点,

机器没有花时间思考,“哦,条件没有满足 - 这意味着满足!(条件),意味着执行另一个分支!”。机器的行为是计算“固有”的。简化到极端,有电压,去这里...不存在,去那里。

一些编程语言通过
短路评估

switch语句来利用这一点。 通常,这没什么大不了的,总体上可以被视为理所当然/忽略。但是,请考虑这一点(

也可以应用于结构,真的

),

    我有课
  • Ball

    类有一个color属性(它是std::string),我可以使用经典的getter和setter函数获取和设置它。

  • 我创建了一个包含
  • 十亿个

    Ball 对象的数组。

  • 我要遍历数组,并且
  • 如果球颜色为
      红色
    • ,则显示一条消息。假设这是一个便宜的操作。 如果球颜色为蓝色
    • ,则
    • 将颜色更改为黑色。假设这是一个成本非常高的操作。
  • 我知道后一种情况(成本高昂的运营分支)大约会发生
  • 0.05%的时间

  • 循环内
  • 的两段代码之间会有区别吗?

    案例一:

    if(ball_array[i].getColor().compare("red") == 0) { std::cout << "Red! Yay!" << std::endl; } else { ball_array[i].setColor("black"); }
    • 案例2:
      
      if(ball_array[i].getColor().compare("blue") == 0) { ball_array[i].setColor("black"); } else { std::cout << "Red! Yay!" << std:endl; }
    • 
      
    如果我们构造一个有限自动机,则没有区别(
  • 除非 if 条件的评估是不平凡的
...让我们在这个问题中忽略这一点)。

我想说这是有区别的,后者会减慢程序速度。

我愿意承认,对于

完全编译

语言来说,两段代码实际上可能没有区别,但是,我仍然认为

对于解释语言,从代码到机器代码的翻译不是1由于必须实时解析源代码,因此变为 1。根据解析树结构,其中一个或另一个将先出现并放弃瞬时分支。 我的假设正确吗?为什么?

一个简单的答案,即使在解释语言中,差异也应该绝对为零,因为无论您要比较什么以及它有多常见,您仍然需要调用比较函数(或其等效函数)。即使存在差异,也非常小,根本不重要,除非你有数万亿张支票,我想你没有
c++ if-statement conditional-statements programming-languages
1个回答
0
投票

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