繁体   English   中英

实际使用该返回值时,如何仅支付该函数创建的返回值的成本?

[英]How do I only pay the cost of a function's created return value, when that return value is actually used?

通常,我看到转换器函数将按引用获取参数,并且还返回与函数的返回值相同的参数。

例如:

std::string& Lowercase(std::string & str){
    std::transform(str.begin(), str.end(), str.begin(), ::tolower);
    return str;
}

我知道这样做是为了方便,而且我的印象是,编译器将针对实际未使用返回值的情况进行优化。 但是,我不相信编译器可以针对非基本类型的新创建的返回值进行优化。 例如:

std::tuple<int,std::string,float> function(int const& num, std::string const& str, float const& f){

    return std::tuple<int,std::string,float>(num,str,f);
}

构造函数几乎可以做任何事情,尽管不使用返回类型,但这并不意味着避免创建该类型是安全的。 但是,在这种情况下,当不使用函数的返回值时不创建类型将是有利的。

是否可以通过某种方式通知编译器,如果未使用返回类型,则可以避免创建该类型吗? 这将是特定于功能的,并且是程序员的决定; 编译器无法自行解决的问题。

对于function ,如果函数没有内联,则它可能无法优化它,因为它具有非平凡的构造函数 但是,如果函数是内联的,则在其生命周期不影响任何参数的情况下,它可能会优化未使用的返回类。 另外,由于元组是标准类型,我相信大多数编译器都会优化返回的变量。

通常,编译器可以通过两种方式优化代码:

  1. (命名)返回值优化(RVO / NRVO)
  2. R值参考

RVO

以下面的代码为例:

struct A {
    int v;
};

A foo(int v) {
    A a;
    a.v = v;
    return a;
}

void bar(A& a, int v) {
    a.v = v;
}

A f;
f = foo(1);

A b;
bar(b, 1);

在函数foo ,将构造变量a ,修改其成员v并返回。 在人为优化的版本bara会传入,修改并提供给调用者。

显然, fb是相同的。

而且,如果您了解更多有关C ++的知识,您将知道从foo返回时,结果a被复制到外部f ,并且将调用a的dtor。

使优化的foo成为bar方法称为RVO ,它省略了内部a到外部f的副本。 修改直接转到调用方的变量。

请当心,在某些情况下RVO将不适用:复制ctor具有副作用,多次退货等。

这是详细的说明:
MSDN
CppWiki

价值

优化返回值的另一种方法是使用C ++ 11中引入的rvalue ctor 。通常来说,这就像调用std::swap(vector_lhs, vector_rhs)交换内部数据指针以避免深度复制。

这是一篇关于优化的很好的文章: http : //cpp-next.com/archive/2009/08/want-speed-pass-by-value/

最后但并非最不重要的

Going Native 2013中 ,Andrei Alexandrescu发表了有关如何编写快速C ++代码的演讲。 通过引用传递比rvalue更快。 (RVO也有一些限制)因此,如果您确实关心性能,请使用通过引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM