Return 引用静态向量很慢

Return static vector by reference is slow

我正在设置一个缓存来绘制一些形状。我的方法如下:

我创建了一个 class OrbitCacheManager.h,看起来像这样:

#ifndef OrbitCacheManager_h
#define OrbitCacheManager_h
#include <vector>
#include "cache_0_0.h"
#include "cache_1_0.h"
// many more includes

namespace Core {

   class OrbitCacheManager
   {
   public:
        static std::pair<float,float> getValue(const std::pair<int,int>& type, float phase, float param)
        {
            auto cache = getCacheData(type);
            // interpolate values based on phase and param
            return calculated_value;
        }
   private:
        static std::vector<std::pair<float,float>>& getCacheData(const std::pair<int,int>& type)
        {
            if (type.first == 0 && type.second == 0) return cache_0_0::values;
            if (type.first == 1 && type.second == 0) return cache_1_0::values;
            // etc
        }

缓存文件如下所示:

cache_0_0.h:

#ifndef cache_0_0_h
#define cache_0_0_h 
#include <vector>
namespace Core {
class cache_0_0{
public:
    static std::vector<std::pair<float,float>> values;
};
};
#endif

cache_0_0.cpp:

#include "cache_0_0.h"
using namespace Core;
std::vector<std::pair<float,float>> cache_0_0::values = {
{ 0.000000, 1.000000 },     { 0.062791, 0.998027 }, // etc

这是 运行 这样的:

for (some phase range) {
    auto v = OrbitCacheManager::getValue(type, phase, param);
    // do something with v
}

这种方法真的很慢,分析器显示了很多 CPU 个峰值,UI 真的很慢。

当我将 OrbitCacheManager.h 中的 getCacheData 方法重构为:

static std::vector<std::pair<float,float>>* getCacheData(const std::pair<int,int>& type) 
{
    if (type.first == 0 && type.second == 0) return &(cache_0_0::values);

一切都按预期开始工作。

我的问题是,为什么这种变化会如此显着地提高速度?

我在 IOS

上使用 clang c++11

您可能会 return 通过引用对其进行处理,但您正在存储在另一个对象中,因此仍在进行昂贵的复制:

 auto& cache = getCacheData(type);

您应该通过引用在 return 的任何地方添加 & 并期望保留引用而不是副本。