[英]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
,如果函数没有内联,则它可能无法优化它,因为它具有非平凡的构造函数 。 但是,如果函数是内联的,则在其生命周期不影响任何参数的情况下,它可能会优化未使用的返回类。 另外,由于元组是标准类型,我相信大多数编译器都会优化返回的变量。
通常,编译器可以通过两种方式优化代码:
以下面的代码为例:
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
并返回。 在人为优化的版本bar
, a
会传入,修改并提供给调用者。
显然, f
和b
是相同的。
而且,如果您了解更多有关C ++的知识,您将知道从foo
返回时,结果a
被复制到外部f
,并且将调用a
的dtor。
使优化的foo
成为bar
方法称为RVO
,它省略了内部a
到外部f
的副本。 修改直接转到调用方的变量。
请当心,在某些情况下RVO将不适用:复制ctor具有副作用,多次退货等。
优化返回值的另一种方法是使用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.