C++在for循环之前或不获取参数

C++在for循环之前或不获取参数,c++,performance,loops,sdl-2,C++,Performance,Loops,Sdl 2,在这种情况下,最佳做法是什么: 在运行for循环之前是否应该获取变量,如下所示: void Map::render(int layer, Camera* pCam) { int texture_index(m_tilesets[layer]->getTextureIndex()); int tile_width(m_size_of_a_tile.getX()); int tile_height(m_size_of_a_tile.getY()); int

在这种情况下,最佳做法是什么:

在运行for循环之前是否应该获取变量,如下所示:

void Map::render(int layer, Camera* pCam)
{
    int texture_index(m_tilesets[layer]->getTextureIndex());

    int tile_width(m_size_of_a_tile.getX());
    int tile_height(m_size_of_a_tile.getY());

    int camera_x(pCam->getPosition().getX());
    int camera_y(pCam->getPosition().getY());

    int first_tile_x(pCam->getDrawableArea().getX());
    int first_tile_y(pCam->getDrawableArea().getY());

    int map_max_x( (640 / 16) + first_tile_x );
    int map_max_y( (360 / 16) + first_tile_y );

    if (map_max_x > 48) { map_max_x = 48; }
    if (map_max_y > 28) { map_max_x = 28; }

    Tile* t(nullptr);

    for (int y(first_tile_y); y < map_max_y; ++y) {
        for (int x(first_tile_x); x < map_max_x; ++x) {

            // move map relative to camera
            m_dst_rect.x = (x * tile_width) + camera_x;
            m_dst_rect.y = (y * tile_height) + camera_y;

            t = getTile(layer, x, y);
            if (t) {
                pTextureManager->draw(texture_index, getTile(layer, x, y)->src, m_dst_rect);
            }
        }
    }
}

还是像这样直接将其放入循环中更好?在这种情况下,代码较短,但可读性较差:

void Map::render(int layer, Camera* pCam)
{
    int first_tile_x(pCam->getDrawableArea().getX());
    int first_tile_y(pCam->getDrawableArea().getY());

    for (int y(first_tile_y); y < (640 / 16) + first_tile_x; ++y) {
        for (int x(first_tile_x); x < (360 / 16) + first_tile_y; ++x) {

            // move map relative to camera
            m_dst_rect.x = (x * m_size_of_a_tile.getX()) + pCam->getPosition().getX();
            m_dst_rect.y = (y * m_size_of_a_tile.getY()) + pCam->getPosition().getY();

            Tile* t(getTile(layer, x, y));
            if (t) {
                pTextureManager->draw(m_tilesets[layer]->getTextureIndex(), getTile(layer, x, y)->src, m_dst_rect);
            }
        }
    }
}


使用一种方法比使用另一种方法对性能有影响吗?

从语法上讲,第二个版本是首选的,因为它在使用对象的范围内包含对象,而不是泄漏到不同的上下文中。在性能方面,您将需要分析,但如果有任何差异,我会感到惊讶,因为编译器通常会注意到结果不会改变,至少对于简单函数是如此,并为您执行此优化


对于更复杂或可能是动态的函数,但您知道它们在For循环期间不会更改其结果,因此在循环之前定义它们是有意义的。

请告诉我们是什么让代码变得更好。更快的代码是否更好?然后用内森的建议。您是否需要在6个月内轻松理解您的代码?使用您觉得更容易阅读的代码。希望其他同事、朋友、开源社区更喜欢它?这是一个过于固执己见的问题。因为它是一个循环来呈现一个分幅向量,它必须尽可能快地运行。我只是想知道,在循环之前调用一次方法并将结果存储在一个新变量中,或者在循环编译器中多次调用方法,这几天效果非常好,如果两者都能产生相同的结果,我也不会感到惊讶。作为C++的新用户,我不知道编译器认为是什么。我在另一种生活中使用汇编程序,对我来说,我认为最好保留一个结果,而不是在一个循环中多次计算它。这样做的特定优化在gcc中称为循环不变运动-ftree循环im。它将不更改的表达式移出循环以避免冗余操作。