在这种情况下编译器是否优化?

时间:2017-08-22 15:56:28

标签: c++ game-engine compiler-optimization

我正在使用visual studio,目前正在用c ++创建一个游戏引擎,它是2D的。目的是一般地学习现代游戏引擎架构和基于组件的系统。这意味着我有一个非常注重绩效的思维模式(尽管在现代硬件上开发2D时,性能不是很大的问题)。

编译器会优化这样的东西吗?

template<class T>
inline T & Scene::accessComponent(unsigned int id)
{
    if (dynamic_cast(T*) < Transform > ) {
        ...
    }
    else if (dynamic_cast(T*) < Collidable > ) {
        ...
    }
    else if (dynamic_cast(T*) < AnotherComponentType > ) {
        ...
    }

    etc ...
}

我听说如果函数在顺序调用中进入相同的逻辑门,编译器可以针对将来的调用进行优化。这是否适用于模板化功能?如果T在顺序调用中属于同一类型,编译器会进行优化吗?

我无法分析任何内容,因为目前代码很乱,允许进行accessComponent调用的引擎的不同部分尚未实现。所以我有点处于规划阶段。

1 个答案:

答案 0 :(得分:1)

这段代码当然不应该在面向性能的代码中完成。它遭受多个分支。逻辑上,每个dynamic_cast检查都有至少两个分支:由编译器本身生成的分支(用于检查RTTI)和由if语句生成的分支。

现代硬件中的分支预测器功能强大,但有限。至少,它们的数量是有限的,而且如果事件的分布或多或少均匀,它们就会失败。

即使分支预测成功,你仍然会在分支计算本身上松开一些周期。

我认为没有理由进行动态演员表演。由于您的类已经是多态的,只需调用相应的虚方法。