【问题标题】:Do I need to use std::move again?我需要再次使用 std::move 吗?
【发布时间】:2013-07-10 00:13:51
【问题描述】:

对于下面的代码,我想使用 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);
}

【问题讨论】:

  • 第一个函数应该是return result;。这个已经讨论过很多次了,e.g. here

标签: c++11 rvalue


【解决方案1】:

move() 不应用于这些功能。

在第一个函数中,您将返回一个局部变量。如果没有move(),大多数(全部?)编译器将执行 NRVO,您将无法获得副本或移动——返回的变量将直接在调用者的返回值中构造。即使编译器由于某种原因无法执行 NRVO,局部变量在用作 return 的参数时也会变成 r 值,所以无论如何你都会有所行动。在此处使用 move() 仅用于禁止 NRVO 并强制编译器进行移动(或在移动不可行的情况下进行复制)。

在第二个函数中,您已经返回了一个右值,因为第一个函数按值返回。 move() 这里除了复杂性之外没有增加任何东西(这可能会使优化器产生次优代码或无法进行复制省略)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 2015-05-07
    • 2015-05-10
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多