C ++静态内部函数

时间:2017-05-15 11:44:04

标签: c++

你好我有一个返回std ::对的函数,经常被调用。

std::pair<sf::Vector2i, sf::Vector2i> 
Map::map_coord_to_chunk_coord(int x, int y) {
  // Get the chunk position
  int chunk_x = x / CHUNK_SIZE;
  int chunk_y = y / CHUNK_SIZE;

  // Get the position inside the chunk
  x = x - chunk_x * CHUNK_SIZE;
  y = y - chunk_y * CHUNK_SIZE;

  // Return the chunk position and the position inside it
      return std::pair<sf::Vector2i, sf::Vector2i>(sf::Vector2i(chunk_x, 
chunk_y), sf::Vector2i(x, y));
}

最好将该对声明为静态,以便每次都不会创建它。

std::pair<sf::Vector2i, sf::Vector2i> 
Map::map_coord_to_chunk_coord(int x, int y) {
  static std::pair<sf::Vector2i, sf::Vector2i> coords;

  // Get the chunk position
  coords.first.x = x / CHUNK_SIZE;
  coords.first.y = y / CHUNK_SIZE;

  // Get the position inside the chunk
  coords.second.x = x - coords.first.x * CHUNK_SIZE;
  coords.second.y = y - coords.first.y * CHUNK_SIZE;

  // Return the chunk position and the position inside it
  return coords;
}

我运行callgrind,看起来这个函数快了3倍,但这是一个好习惯吗?

3 个答案:

答案 0 :(得分:6)

通常,当唯一的目标是节省CPU周期时,应该避免使用static

使coords静态呈现您的map_coord_to_chunk_coord函数non-reentrant,这意味着它在没有正确同步的并发环境中不再可用。这对于节省一个简单物体的建筑成本来说是一个非常高的代价。

例如,您应该能够使用std::pair来优化make_pair的构造:

inline std::pair<sf::Vector2i, sf::Vector2i> 
Map::map_coord_to_chunk_coord(int x, int y) {
    int first_x = x / CHUNK_SIZE;
    int first_y = y / CHUNK_SIZE;
    return std::make_pair(
        sf::Vector2i(first_x, first_y)
    ,   sf::Vector2i(x - first_x * CHUNK_SIZE, y - first_y * CHUNK_SIZE)
    );
}

在某些情况下编译器can even optimize out the copying,进一步提高了性能。

答案 1 :(得分:2)

正如其他人指出的那样,你通常应该避免以这种方式使用本地静态变量,因为它使代码非线程安全。

通常,最惯用的C ++依赖于返回值优化和其他编译器优化。如果构造std::pair sf::Vector2i void map_coord_to_chunk_coord(int x, int y, std::pair<Vector2i, Vector2i>& chunk_coord) { chunk_coord.first.x = x / CHUNK_SIZE; chunk_coord.first.y = y / CHUNK_SIZE; chunk_coord.second.x = x % CHUNK_SIZE; chunk_coord.second.y = y % CHUNK_SIZE; } 是您代码中的瓶颈,我会感到惊讶(并且有点羡慕)但如果这确实是您代码中的关键部分,那么您可能会稍微不那么惯用pass-by-reference而不是使用返回值:

chunk_coord

然后调用者可以在紧密循环中重复使用std::pair变量,而您没有sf::Vector2iapp.factory('ReportData', function() { var factoryData = []; var factoryService = {}; factoryService.add = function(myData) { console.log('FACTORY ADD: ' + myData) factoryData = myData; }; factoryService.get = function() { console.log('FACTORY GET: ' + factoryData) return factoryData; }; return factoryService; //you're missing this return statement }); 的结构。

答案 2 :(得分:1)

没有

无论如何你必须复制它(按值返回!),所以你什么也得不到。

(你实际上正好添加了一个构造。)

你所取得的成就是让你的功能不可重入,这是一个倒退。