【问题标题】:optimizing class construction in c++在 C++ 中优化类构造
【发布时间】:2017-04-22 12:42:24
【问题描述】:

我有一堂课:

class A
{
    double a;
    map <int, double> b;
    public:
    A():a(0.0){}
    A(const double aa, const map <int, double> & bb): a(aa), b(bb){}
    A(double && aa, map <int, double> && bb):a(aa), b(bb) {} 
};

优化器 (VS2012) 显示行 A(a1*b1, std::move(bmap)) 占用大部分时间。

我在这里遗漏了什么可以加快对象构造的东西吗?我最近才开始学习移动构造函数,所以我不确定我的移动构造函数或其使用是否最优。

关于代码的更多信息: 我有

 A operator *( double in)
 {
  if(in !=0.0)
    {
     map<int, double> tmp(b); //second bottleneck
     for(auto & itr: tmp)
        tmp.second *= in;
     return A(in * a, std::move(tmp)); //first optimization bottleneck
    }
  return A();
 }

【问题讨论】:

  • 那堂课你在做什么?构造函数可能会占用大部分时间,因为您正在大量使用它(或滥用它,谁知道?)......

标签: c++11 visual-studio-2012 optimization constructor move


【解决方案1】:

不确定这是否是您的性能问题的罪魁祸首,但您实际上并没有将tmp 移动到A::b。您需要将bb 移动到A::b,因为bb 是一个左值:

A(double && aa, map <int, double> && bb):a(aa), b(std::move(bb)) {} 
//                                                ^^^^^^^^^^^^^

这是一个说明问题的minimal example on wandbox

【讨论】:

  • 不应该自行发生,因为我有&amp;&amp;?
  • @user6386155:如果参数中有&amp;&amp;,则表示您只接受右值引用。一旦你得到一个右值引用,它就会“绑定”到bb,这是一个左值(即你可以说auto ptr = &amp;bb;。要使bb 再次成为右值,您需要std::move 它。
  • @user6386155: This additional example 表示正在制作副本。
  • @user6386155:不客气。如果它解决了您的性能问题,请告诉我:)
  • @user6386155:太棒了。如果您觉得它解决了您的问题,请不要忘记接受此答案。此外,您可以尝试不同的方法。根据您的地图大小,您可以简单地使用一个数组(并跟踪使用/未使用的索引),或者您可以使用类似 boost::flat_map 的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 2012-03-04
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多