在c ++性能问题中使用getter返回映射

Coo*_*eek 2 c++ stdmap std rvo

我有一个类有3-4个数据类型的成员,std::map<string, vector<string>>用于缓存数据.它的实例创建一次,数据填入服务调用的所有映射中.我有用于访问这些地图的getter函数.(这里也有一些线程锁定逻辑)

这些getter函数被调用了很多次,我很担心性能,因为地图对象被复制了很多次.

class A {
  private:
    map<string, vector<string>> m1;
    map<string, vector<string>> m2;
    map<string, vector<string>> m3;

  public:
    map<string, vector<string>> getm1() { return m1; }
    map<string, vector<string>> getm2() { return m2; } 
    map<string, vector<string>> getm3() { return m3; }
}

class B {
   B() { }
   static A a;

   map<string, vector<string>> getm1() { return a.m1; }
   map<string, vector<string>> getm2() { return a.m2; } 
   map<string, vector<string>> getm3() { return a.m3; } 
} 
Run Code Online (Sandbox Code Playgroud)

这些getter函数有多次从类调用B.掌握了cpp的中间知识,我知道getter会按值返回整个地图.但是,这将是更好的参考或使用共享指针到地图等存储构件变量传递它m1,m2,m3shared_ptr<map>

  shared_ptr<map<string, vector<string>>> getm1() { return a.m1; } 
Run Code Online (Sandbox Code Playgroud)

这不是一个性能问题,将由编译器负责吗?

在阅读了一些关于返回值优化并稍微理解它之后,编译器可以处理一些优化.这是RVO的一部分吗?

先感谢您.

Rob*_*juk 9

将引用(&)返回到const地图.

class A
{    
    using Map_type = std::map<std::string, std::vector<std::string>>;

    Map_type m1;
    Map_type m2;
    Map_type m3;

  public:
    const auto& getm1() const { return m1; }
    const auto& getm2() const { return m2; } 
    const auto& getm3() const { return m3; }
};
Run Code Online (Sandbox Code Playgroud)

这将允许调用函数"只读"访问地图而无需支付副本的价格.


对于C++ 11及更低版本,不必auto作为返回类型,必须在函数上声明返回类型.也using仅适用于C++ 11及更高版本,但typedef必须使用早期的编译器.

class A
{    
    typedef std::map<std::string, std::vector<std::string>> Map_type;

    Map_type m1;
    Map_type m2;
    Map_type m3;

  public:
    const Map_type& getm1() const { return m1; }
    const Map_type& getm2() const { return m2; } 
    const Map_type& getm3() const { return m3; }
};
Run Code Online (Sandbox Code Playgroud)