0

以下のコードでは、 std::move を使用して効率を改善したいと考えています。最初の関数は std::move を使用し、2 番目の関数は最初の関数を呼び出すだけです。では、関数「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);
}
4

1 に答える 1

0

move()これらの関数のいずれにも使用しないでください。

最初の関数では、ローカル変数を返しています。がなければmove()、ほとんどの (すべて?) コンパイラは NRVO を実行し、コピーや移動を取得しません。返された変数は、呼び出し元の戻り値で直接構築されます。コンパイラがなんらかの理由で NRVO を実行できない場合でも、ローカル変数は a への引数として使用されると右辺値になるreturnため、とにかく動きます。ここでの使用move()は、NRVO を禁止し、コンパイラに強制的に移動 (または移動が実行できない場合はコピー) を強制するだけです。

2 番目の関数では、最初の関数が値を返すため、既に r 値を返しています。 move()ここでは、複雑さ以外には何も追加しません (オプティマイザーを混乱させて、最適ではないコードを生成したり、コピーの省略に失敗したりする可能性があります)。

于 2013-07-10T05:36:53.683 に答える