对于下面的代码,我想使用std :: move来提高效率。我有两个函数,第一个函数使用std :: move,第二个函数只调用第一个函数。那么,我需要在函数“vector convertToString()”中再次使用std :: move吗?为什么不呢?谢谢。
class Entity_PortBreakMeasure
{
public:
Entity_PortBreakMeasure(){}
int portfolioId;
string portfolioName;
int businessDate;
string assetType;
string currency;
string country;
string industry;
string indicator;
double value;
inline double operator()()
{
return value;
}
static vector<string> convertToString(Entity_PortBreakMeasure& pbm)
{
//PORTFOLIOID INDUSTRY CURRENCY COUNTRY BUSINESSDATE ASSETTYPE INDICATOR VALUE PORTFOLIONAME
vector<string> result;
result.push_back(boost::lexical_cast<string>(pbm.portfolioId));
result.push_back(pbm.industry);
result.push_back(pbm.currency);
result.push_back(pbm.country);
result.push_back(Date(pbm.businessDate).ToString());
result.push_back(pbm.assetType);
result.push_back(pbm.indicator);
result.push_back(boost::lexical_cast<string>(pbm.value));
result.push_back(pbm.portfolioName);
return std::move(result);
}
vector<string> convertToString()
{
return convertToString(*this);
}
答案 0 :(得分:0)
move()
不应该用于这两种功能。
在第一个函数中,您将返回一个局部变量。如果没有move()
,大多数(所有?)编译器将执行NRVO并且您将无法获得副本或移动 - 返回的变量将直接在调用者的返回值中构造。即使编译器由于某种原因无法执行NRVO,当用作return
的参数时,局部变量也会成为r值,因此无论如何您都将获得移动。在这里使用move()
仅用于禁止NRVO和强制编译器进行移动(或者在移动不可行的情况下复制)。
在第二个函数中,您已经返回一个r值,因为第一个函数按值返回。 move()
这里除了复杂性之外不会添加任何东西(这可能会使优化器混淆产生次优代码或无法复制省略)。