Visual C++ 2015中的慢速测距 有人知道为什么在O/Ox的Visual C++发布模式下,循环循环的执行速度会比手动循环慢得多吗?编译器问题,还是我忽略了什么?有办法解决这个问题吗

Visual C++ 2015中的慢速测距 有人知道为什么在O/Ox的Visual C++发布模式下,循环循环的执行速度会比手动循环慢得多吗?编译器问题,还是我忽略了什么?有办法解决这个问题吗,c++,visual-c++,C++,Visual C++,最佳性能150毫秒执行: for (int i = 0; i < collidables.size(); ++i) { for (int j = 0; j < collidables.size(); ++j) { Collidable* first = collidables[i]; Collidable* second = collidables[j]; if (first != second &&

最佳性能150毫秒执行:

for (int i = 0; i < collidables.size(); ++i)
{
    for (int j = 0; j < collidables.size(); ++j)
    {
        Collidable* first = collidables[i];
        Collidable* second = collidables[j];

        if (first != second && first->valid(second))
        {
            handle(first);
        }
    }
}
for (auto first : collidables)
{
    for (auto second : collidables)
    {
        if (first != second && first->valid(second))
        {
            handle(first);
        }
    }
}
for (auto& first : collidables)
{
    for (auto& second : collidables)
    {
        if (first != second && first->valid(second))
        {
            handle(first);
        }
    }
}
执行190ms时性能不佳:

for (int i = 0; i < collidables.size(); ++i)
{
    for (int j = 0; j < collidables.size(); ++j)
    {
        Collidable* first = collidables[i];
        Collidable* second = collidables[j];

        if (first != second && first->valid(second))
        {
            handle(first);
        }
    }
}
for (auto first : collidables)
{
    for (auto second : collidables)
    {
        if (first != second && first->valid(second))
        {
            handle(first);
        }
    }
}
for (auto& first : collidables)
{
    for (auto& second : collidables)
    {
        if (first != second && first->valid(second))
        {
            handle(first);
        }
    }
}

当使用-Ofast在GCC中编译时,这三个代码段的执行速度都是120ms。

您尝试过/O2吗?另外,请提供一个文件夹,以便每个人都可以复制、粘贴和检查。我已尝试/O2。与/Ox的速度相同。我将看看是否可以快速生成一个简单的示例。VS 2015尚未完成。这是本周发布的候选版本吗?如果是这样,考虑提交一个bug报告。什么类型是可碰撞的?在第三版本中,Autoand引起比以前版本更高的间接级别。