我们可以信任多少编译器优化?

时间:2017-03-14 17:45:55

标签: c++ optimization compiler-optimization

我编写了以下代码来计算两个圆的交叉点。代码简单而且足够快。并不是说我需要更多优化,但我可以考虑更积极地优化这些代码。例如,public boolean shouldIgnore(String description){ char [] arr = description.toCharArray(); boolean slashFound = false; if(!isItANumber(arr[0])){ return true; } for(int i=1 ; i<arr.length ; i++){ if(isItANumber(arr[i])){ continue; } else{ if(!slashFound){ if(arr[i]=='/'){ if(!isItANumber(arr[i+1])) return true; slashFound = true; i++; continue; } else{ return true; } } else{ if(arr[i]=='.'){ return false; } else{ return true; } } } } return false; } public boolean isItANumber(char c){ return (int)c >= 48 && (int)c <=57; } h/d计算两次(让我们忘记编译器优化)。

1.0/d

我的问题是我们可以信任多少C ++编译器(这里是g ++)来理解代码并优化最终的二进制文件? g ++可以避免两次const std::array<point,2> intersect(const circle& a, const circle& b) { std::array<point,2> intersect_points; const float d2 = squared_distance(a.center, b.center); const float d = std::sqrt(d2); const float r12 = std::pow(a.radious, 2); const float r22 = std::pow(b.radious, 2); const float l = (r12 - r22 + d2) / (2*d); const float h = std::sqrt(r12 - std::pow(l,2)); const float termx1 = (1.0/d) * (b.center.x - a.center.x) + a.center.x; const float termx2 = (h/d)*(b.center.y - a.center.y); const float termy1 = (1.0/d) * (b.center.y - a.center.y) + a.center.y; const float termy2 = (h/d)*(b.center.x - a.center.x); intersect_points[0].x = termx1 + termx2; intersect_points[0].y = termy1 - termy2; intersect_points[1].x = termx1 - termx2; intersect_points[1].y = termy1 + termy2; return intersect_points; } 吗?更准确地说,我想知道这条线在哪里。什么时候我们应该对编译器进行精细调整以及何时进行优化?

1 个答案:

答案 0 :(得分:1)

如今流行的编译器在优化方面相当不错。 优化程序很可能会检测到1.0/d之类的常见表达式,因此请不要关心此问题。 优化程序更不可能将std:pow( x, 2 )替换为x * x。 这取决于您使用的确切函数,您使用的编译器版本以及优化命令行开关。所以在这种情况下,你最好写x * x。 很难说优化器可以走多远,当你作为一个人必须接管时,这取决于如何&#34; smart&#34;优化器是。但根据经验,编译器可以优化它可以从代码行中扣除的东西。 例: 编译器会知道这个术语总是错误的:1 == 2 但它无法知道这也总是错误的:1 == nextPrimeAfter(1),因为它必须知道函数nextPrimeAfter()的作用。