On May 30, 3:28 pm, Andreas Dehmel wrote:
On Thu, 30 May 2013 02:06:37 -0700 (PDT)
SG <s.gesem...@gmail.com> wrote:
On May 29, 11:46 pm, James Kanze wrote:
The ubiquitous rule is to pass class types by reference to
const, other types by value. Since std:;string is a class type,
convention says to pass it by reference to const, even if with a
well written string class, it won't make a significant
difference.
Some rules are now outdated in the light of move semantics.
Nonsense. For container types, a move still implies swapping at
least 2-3 pointer-sized members and while this is certainly orders
of magnitude faster than copying the whole thing, there's no way
this'll be faster than simply dereferencing a pointer.
Compare
string flip(string const& cref) {
string result = cref; // explicit copy,
// might be unnecessary
reverse(result.begin(),result.end());
return result; // NRVO applicable
}
with
string flip(string temp) { // temp might be move-constructed or
// even constructed directly via
// copy/move elision
reverse(temp.begin(),temp.end());
return temp; // implicitly moved
}
You might want to test this with a dummy-string class and count the
number of copy and move constructions in the following example:
int main() {
string foo = flip(flip(flip(flip("hello"))));
}
So, no, it's not nonsense. In situations where you have the choice
between pass-by-value and pass-by-ref-to-const for class types, the
rule "always take a ref-to-const" is obviously not correct anymore.
Note that I'm not saying "always use pass-by-value" either.
You might also want to check Dave Abrahams' article about this with
the provoking title: "Want speed? Pass by value.":
http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
Who cares? I want readability and maintainability. Which means
conforming to the usual conventions. If the profiler says that
comment as to why). But otherwise, I write code in the expected
manner, so that the reader isn't surprised.