0

我最近切换到使用 Android ndk-r9 并且我的应用程序遇到了一些困难,这似乎与编译器优化有关。我有以下功能:

int GetTouchPos(GTouchEvents * pEvents, GPointF * pPos, int * pButton = 0)
{
    int                count    = 0;
    GTouchEvent    *    pEvent;        

    if (pEvents->GetCount(&count) == GResult_Ok)
    {
        GDebugLog((GS("GetTouchPos: count = %d"), count));

        if (pEvents->GetEvent(0, &pEvent) == GResult_Ok)
        {
            pEvent->GetTapPos(pPos);

            if (pButton)
            {
                pEvent->GetButton(pButton);
            }

            pEvent->Release();
        }
    }

    return(count);
}

如果我构建我的项目并运行它,对 GDebugLog 的调用会格式化并记录变量“count”的值。当我这样做时,'count' 为 1,我的应用程序正常工作。但是,如果我注释掉 GDebugLog 行(并且不进行其他更改),当我运行我的应用程序时,它就不再工作了。在函数 GTouchEvents::GetCount 中,我还记录了它返回的内容,并且该值始终正确为“1”。此外,我记录了对上述函数(即 GetTouchPos)的调用的返回。当存在 GDebugLog 行时,记录的返回值是正确的值“1”。然而,当我注释掉 GDebugLog 调用时,记录的返回值是一个看似随机的数字,看起来很像一个未初始化的变量。

请注意,当我使用 r8b 时,这一切都适用于我们没有 GDebugLog 行的情况。另请注意,如果我关闭优化,无论调试行是否存在,此代码都可以使用 r9 完美运行。另请注意,此行为仅在为 ARM 处理器编译时出现。我为 x86 构建的版本没有问题。

我是否在这里做一些有问题的事情导致优化器生成不正确的代码?

任何人都可以阐明可能发生的事情吗?

谢谢。

4

0 回答 0