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

时间:2012-05-11 11:19:34

标签: c++ c optimization complexity-theory

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

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

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

    if (myList.size() < 5) return 1;
    else return 2;

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

4 个答案:

答案 0 :(得分:15)

理论上,如果size()被内联,则存在这种可能性,但是为了执行编译器必须进行的优化

  1. 检测您是否专门测试“小于”条件
  2. 证明循环(假设为了讨论的目的存在循环)导致变量单调增加
  3. 证明循环体没有可观察到的副作用
  4. 恕我直言,这是一大堆可以依赖的功能,它包含的功能在其他环境中并不“明显有用”。请记住,编译器供应商的资源有限,因此必须有充分的理由来实现这些先决条件,并让编译器将所有部分组合在一起以优化这种情况。

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

答案 1 :(得分:11)

实际上,在C ++ 11中,std::list已经过优化,size()会在固定时间内返回。

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

  

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

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

答案 2 :(得分:2)

myList.size()函数本身无法为您正在使用它的目的进行编译,因此它将确定整个大小。为了获得您建议的优化,您需要一个专用的谓词函数,而不是一般的size(),如bool sizeLessThan(int);

答案 3 :(得分:2)

您在询问编译器是否可以使函数的行为有所不同,具体取决于其结果的使用方式。这只能用于内联函数,其中调用者和函数将同时编译在一起。对于除此之外的任何事情,这似乎相当长。