C和C ++编译器通常会优化与函数的比较吗?
例如,this page表明C ++中std :: lists上的size
函数在某些标准库实现中可能具有线性复杂度O(N)(这对于链表是有意义的)
但在这种情况下,如果myList
是一个巨大的列表,那会是什么样的呢?
if (myList.size() < 5) return 1;
else return 2;
size()函数会查找并计算所有N个列表成员,还是会在找到5个成员后进行短路优化?
答案 0 :(得分:15)
理论上,如果size()
被内联,则存在这种可能性,但是为了执行编译器必须进行的优化
恕我直言,这是一大堆可以依赖的功能,它包含的功能在其他环境中并不“明显有用”。请记住,编译器供应商的资源有限,因此必须有充分的理由来实现这些先决条件,并让编译器将所有部分组合在一起以优化这种情况。
即使这是一个针对某人的问题,也可以在代码中轻松解决问题,我觉得不会有这样的理由。所以不,通常你不应该期望这样的情况得到优化。
答案 1 :(得分:11)
实际上,在C ++ 11中,std::list
已经过优化,size()
会在固定时间内返回。
对于C ++ 03,size()
确实在线性时间内运行,因为它需要每次都计算元素。
size()函数会查找并计算所有N个列表成员,还是会在找到5个成员后进行短路优化?
从未见过这种优化在实践中发生。虽然它确实合法,但我怀疑是否有任何编译器实际上实现了类似的东西。
答案 2 :(得分:2)
myList.size()函数本身无法为您正在使用它的目的进行编译,因此它将确定整个大小。为了获得您建议的优化,您需要一个专用的谓词函数,而不是一般的size()
,如bool sizeLessThan(int);
。
答案 3 :(得分:2)
否您在询问编译器是否可以使函数的行为有所不同,具体取决于其结果的使用方式。这只能用于内联函数,其中调用者和函数将同时编译在一起。对于除此之外的任何事情,这似乎相当长。