在 C++ 中优化 class 构造
optimizing class construction in c++
我有一个 class:
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 说明了这个问题。
我有一个 class:
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 说明了这个问题。