我有条件的错误:
while(CurrentObserverPathPointDisplacement > lengthToNextPoint && CurrentObserverPathPointIndex < (PathSize - 1) )
{
CurrentObserverPathPointIndex = CurrentObserverPathPointIndex + 1;
CurrentObserverPathPointDisplacement -= lengthToNextPoint;
lengthToNextPoint = (CurrentObserverPath->pathPoints[min((PathSize - 1),CurrentObserverPathPointIndex + 1)] - CurrentObserverPath->pathPoints[CurrentObserverPathPointIndex]).length();
}
在发布模式下似乎陷入了无限循环。在调试模式下工作正常,或者当我在最后一行上放置调试打印时更加有效
OutputInDebug("Here");
以下是条件本身生成的程序集:
while(CurrentObserverPathPointDisplacement > lengthToNextPoint && CurrentObserverPathPointIndex < (PathSize - 1) )
00F074CF fcom qword ptr [dist]
00F074D2 fnstsw ax
00F074D4 test ah,5
00F074D7 jp ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+27Eh (0F0753Eh)
00F074D9 mov eax,dword ptr [dontRotate]
00F074DC cmp eax,ebx
00F074DE jge ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+27Eh (0F0753Eh)
{
你可以看到,对于第二个条件,它似乎将'dontRotate'(bool类型的函数参数)的值移动到eax中,然后与它进行比较,但dontRotate在该位代码附近使用。
我知道这可能是一些小数据,但它似乎是一个明显的编译器错误。但遗憾的是,我不确定如何将其提炼成一个自足的问题来实际生成错误报告。
编辑: 不是实际减速,而是类型:
double CurrentObserverPathPointDisplacement;
double lengthToNextPoint;
int CurrentObserverPathPointIndex;
int PathSize;
vector<vector3<double>> CurrentObserverPath::pathPoints;
Edit2:
一旦我将debug print语句添加到while的末尾,这就是生成的程序集,它不再表示错误:
while(CurrentObserverPathPointDisplacement > lengthToNextPoint && CurrentObserverPathPointIndex < (PathSize - 1) )
00B1751E fcom qword ptr [esi+208h]
00B17524 fnstsw ax
00B17526 test ah,5
00B17529 jp ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+2D6h (0B175A6h)
00B1752B mov eax,dword ptr [esi+200h]
00B17531 cmp eax,ebx
00B17533 jge ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+2D6h (0B175A6h)
{
答案 0 :(得分:1)
下面:
while(/* foo */ && CurrentObserverPathPointIndex < (PathSize - 1) )
{
CurrentObserverPathPointIndex = CurrentObserverPathPointIndex + 1;
因为在min
发生更改且CurrentObserverPathPointIndex
和CurrentObserverPathPointIndex
都是有符号整数的循环中,这是唯一的一点(除非PathSize
做了一些非常讨厌的事情)相同的大小(并且PathSize
足够小以排除整数提升问题),剩下的浮动点摆弄是无关紧要的。循环必须最终终止(如果CurrentOvserverPathPointIndex
的初始值与PathSize
相比较小,则可能需要相当长的时间。)
这只能得出一个结论;如果编译器生成的代码没有终止(永远),则编译器是错误的。
答案 1 :(得分:0)
看起来PathSize
在循环中没有变化,因此编译器可以在循环之前计算PathSize - 1
并巧合地使用与dontRotate
相同的内存位置,无论是什么。< / p>
更重要的是,CurrentObserverPath->pathPoints
中有多少元素?
您的循环条件包括此测试:
CurrentObserverPathPointIndex < (PathSize - 1)
在你的循环中是这个任务:
CurrentObserverPathPointIndex = CurrentObserverPathPointIndex + 1;
然后是这个进一步增加的下标:
[min((PathSize - 1),CurrentObserverPathPointIndex + 1)]
也许您的代码似乎在调试模式下工作,因为随机未定义的行为似乎有效?