优化类结构在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();
}
不知道这是你的性能问题,的罪魁祸首,但你没有实际移动到tmp
A::b
。你需要移动bb
为A::b
,因为bb
是一个左:
A(double && aa, map <int, double> && bb):a(aa), b(std::move(bb)) {}
// ^^^^^^^^^^^^^
这里有一个minimal example on wandbox,说明了问题。
不应该自己发生,因为我有'&&'? – user6386155
@ user6386155:如果你在参数中有'&&',它意味着**你只接受右值引用**。一旦你得到一个右值引用,它就被绑定到'bb',这是一个左值*(即你可以说'auto ptr = &bb;')*。为了让'bb'再次成为右值,你需要'std :: move'它。 –
@ user6386155:[**此附加示例**](http://melpon.org/wandbox/permlink/R2EDogSZNEDTbty1)显示正在创建副本。 –
你在做什么?构造函数可能会占用大部分时间,因为您正在使用它(或滥用它,谁知道?)...... – MikMik