C++ 访问减慢程序速度的对象变量(C+;+;)

C++ 访问减慢程序速度的对象变量(C+;+;),c++,class,loops,optimization,vector,C++,Class,Loops,Optimization,Vector,我正在编程一个模拟,它通过一个向量循环。在代码中,它执行一个操作,每次迭代计算两个对象的增量x和y。我正在编写的代码: for(unsigned z = 0; z < creatures.size(); z++) { for(unsigned z2 = 0; z2 < creatures.size(); z2++) { if(z != z2) { int delta_x = creatures[z2].xpos - creatures[

我正在编程一个模拟,它通过一个向量循环。在代码中,它执行一个操作,每次迭代计算两个对象的增量x和y。我正在编写的代码:

for(unsigned z = 0; z < creatures.size(); z++) {
    for(unsigned z2 = 0; z2 < creatures.size(); z2++) {
        if(z != z2) {
            int delta_x = creatures[z2].xpos - creatures[z].xpos;
            int delta_y = creatures[z2].ypos - creatures[z].ypos;
        }
    }
}

其他代码也有,但对性能影响不大。我注意到,如果我将delta的赋值改为一个数字,甚至是一个减法运算(如z-z2或类似的运算),程序的“FPS”将从~5提高到~7/8。有什么方法可以加快这个操作吗?

下面的操作可能会更快

const std::size_t size = creatures.size();
for (unsigned z = 0; z + 1 < size; z++) {
    const int zx = creatures[z].xpos;
    const int zy = creatures[z].ypos;
    for (unsigned z2 = z + 1; z2 < size; z2++) {
            const int delta_x = creatures[z2].xpos - zx;
            const int delta_y = creatures[z2].ypos - zy;
    }
}
const std::size\u t size=bioters.size();
对于(无符号z=0;z+1
  • 生物[z].xpos
    移出循环
  • biods.size()
    移动到循环外部
  • 由于对
    {z,z2}
    {z2,z}
    对称,因此将这些作业分组

编辑
生物.size()
移动到循环之外(感谢shawn1874)

以下操作可能会更快

const std::size_t size = creatures.size();
for (unsigned z = 0; z + 1 < size; z++) {
    const int zx = creatures[z].xpos;
    const int zy = creatures[z].ypos;
    for (unsigned z2 = z + 1; z2 < size; z2++) {
            const int delta_x = creatures[z2].xpos - zx;
            const int delta_y = creatures[z2].ypos - zy;
    }
}
const std::size\u t size=bioters.size();
对于(无符号z=0;z+1
  • 生物[z].xpos
    移出循环
  • biods.size()
    移动到循环外部
  • 由于对
    {z,z2}
    {z2,z}
    对称,因此将这些作业分组

编辑
生物.size()
移动到循环之外(感谢shawn1874)

您确定这是对性能有影响的代码吗?这对我来说似乎不太昂贵。
生物的定义在哪里?@EdHeal Vector:
向量生物类本身在头文件中定义。使用探查器确定程序的瓶颈。您是对使用编译器优化选项生成的代码计时,还是对调试生成计时?由于对迭代器和/或访问器进行了大量验证,调试版本中的STL容器访问通常会非常慢。您确定这是对性能有影响的代码吗?这对我来说似乎不太昂贵。
生物的定义在哪里?@EdHeal Vector:
向量生物类本身在头文件中定义。使用探查器确定程序的瓶颈。您是对使用编译器优化选项生成的代码计时,还是对调试生成计时?由于迭代器和/或访问器的大量验证,调试构建中的STL容器访问通常非常慢。哇,真不敢相信我没有想到这一点。非常感谢你!让我走了一半,但我想我可以在其他地方实施这个想法,以使这个项目取得更高的绩效。我想知道为什么访问类变量会占用这么多时间……您是否也尝试过使用迭代器,或者只在循环外调用size一次?如果过度访问属性会导致性能问题,那么反复调用成员函数肯定不会有帮助。哇,真不敢相信我居然没想到这个。非常感谢你!让我走了一半,但我想我可以在其他地方实施这个想法,以使这个项目取得更高的绩效。我想知道为什么访问类变量会占用这么多时间……您是否也尝试过使用迭代器,或者只在循环外调用size一次?如果过度访问属性会导致性能问题,那么反复调用成员函数肯定不会有帮助。size\u t theSize=生物。size()