构造类的性能问题,C ++

时间:2011-10-09 12:47:34

标签: c++ sfml

我知道这是一个简单的问题,但我不知道如何正确地做到我的想法。我正在使用SFML,但您不需要了解它是如何工作的。 这是我的简单代码片段,它生成切片并将其分配给贴图的2D矢量: http://www.pastie.org/2665489

在构造TilePlane对象期间,每个操作(tilesMap[i]).push_back(tile)花费的时间太长,我觉得我正在复制数据而不是使用更优雅的方法。那么在这种情况下,解决这个问题的好方法是什么?

2 个答案:

答案 0 :(得分:1)

正如你所说,问题可能是(tilesMap[i]).push_back(tile), 当您将tile的对象插入列表时,实际上您正在完全复制sf::Image(因为copy-constructor sf::Image而被删除。)

你应该将tile的指针放到列表中。如下所示:

...
      Tile *tile_ptr = new Tile(tileset, rand() % tileset.getSize(), i*32, j*32);

      (tilesMap[i]).push_back(tile_ptr);
...

别忘了,您必须在适当的时间内delete tile_ptr个对象。例如,在~TilePlane()中,您必须迭代列表并delete平铺对象。

答案 1 :(得分:1)

您的代码中存在许多性能问题。如果瓶颈确实来自push_back,你应该采用Masoud的建议并将指针推到数组而不是值。

另一个建议是声明你的函数和构造函数使用引用 - 例如:

Tile::Tile(const Tileset& tileset, int tileId, int posX, int posY)

而不是

Tile::Tile(Tileset tileset, int tileId, int posX, int posY)

按值传递参数将强制创建副本,这可能很昂贵。通过const引用传递可以保证不复制或修改对象。