C&C++编译器是否优化了与函数调用的比较?

Wan*_*uta 19 c c++ optimization complexity-theory

C和C++编译器通常会优化与函数的比较吗?

例如,这个页面表明sizeC++中std :: lists上的函数在某些标准库实现中可能具有线性复杂度O(N)(这对于链表是有意义的).

但在这种情况下,如果myList是一个巨大的列表,这样的事情会怎么样?

    if (myList.size() < 5) return 1;
    else return 2;
Run Code Online (Sandbox Code Playgroud)

size()函数会查找并计算所有N个列表成员,还是会在找到5个成员后优化为短路?

Jon*_*Jon 15

理论上存在size()内联的可能性,但是要执行编译器必须进行的优化

  1. 检测您是否正在测试"小于"条件
  2. 证明循环(假设为了讨论的目的存在循环)导致变量单调递增
  3. 证明循环体没有可观察到的副作用

这是恕我直言的一大堆事情,它包含的功能在其他环境中并非"明显有用".请记住,编译器供应商的资源有限,因此必须有充分的理由来实现这些先决条件,并让编译器将所有部分组合在一起以优化这种情况.

即使这是一个针对某人的性能问题,问题可以在代码中轻松解决,我觉得不会有这样的理由.所以不,通常你不应该期望这样的情况得到优化.

  • @WanderNauta:因为如果没有,除了执行所有迭代以确定最终值是否小于5之外别无选择. (7认同)

Luc*_*ore 11

实际上,在C++ 11中,std::list经过优化并size()在恒定时间内返回.

对于C++ 03,size()确实在线性时间内运行,因为它需要每次都计算元素.

size()函数会查找并计算所有N个列表成员,还是会在找到5个成员后优化为短路?

从未见过这种优化在实践中发生.虽然它肯定是合法的,但我怀疑是否有任何编译器实际上实现了这样的东西.

  • @Jaywalker截至目前,`length xs <k`将遍历GHC中的整个列表,我知道没有实现快捷方式.您可以使用`genericLength xs <k`和合适的惰性数字类型进行快捷操作.或者使用重写规则`forall k xs.length xs <k =如果k <1则为False否则为null(drop(k-1)xs)`,但这是你自己做的,而不是编译器的.并且它会改变`length(1:2:undefined)<2`的行为,例如,这就是编译器无法提供它的原因. (2认同)