优化类结构在C++

优化类结构在C++

问题描述:

我有一个类:优化类结构在C++

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(); 
} 
+0

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

不知道这是你的性能问题,的罪魁祸首,但你没有实际移动到tmpA::b。你需要移动bbA::b,因为bb是一个左:

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

这里有一个minimal example on wandbox,说明了问题。

+0

不应该自己发生,因为我有'&&'? – user6386155

+0

@ user6386155:如果你在参数中有'&&',它意味着**你只接受右值引用**。一旦你得到一个右值引用,它就被绑定到'bb',这是一个左值*(即你可以说'auto ptr = &bb;')*。为了让'bb'再次成为右值,你需要'std :: move'它。 –

+0

@ user6386155:[**此附加示例**](http://melpon.org/wandbox/permlink/R2EDogSZNEDTbty1)显示正在创建副本。 –