Re: STL Vector - pass by reference?
Doug Harrison [MVP] wrote:
On Fri, 10 Aug 2007 08:59:05 +0200, Ulrich Eckhardt
<eckhardt@satorlaser.com> wrote:
Gerry Hickman wrote:
Doug Harrison offered this example:
----- example start -----
I would use pass-by-reference to avoid this needless cost, e.g.
vector<string>::size_type
void GetDeviceClasses(vector<string>& guids)
{
[...]
returns guids.size();
}
Funny. Talking about needless costs and then returning redundant data -
the size can be retrieved from the vector.
What's "funny" is to compare returning a vector<string> by value to
returning its size, the latter being as close to a free operation as there
is, both in terms of complexity and exception safety.
Not to mention, returning the size is a useful thing to do.
Nah, it increases the complexity for the reader. My question would be how
the returnvalue differs from the size. Is it perhaps only the number of
elements added to the vector? No, seriously, I'd prefer a straight-forward
interface _without_ redundancy.
Anyway, why would you write anything but clear code unless you first
determined that it's a bottleneck? Just return the vector by value.
I don't know what's "funnier"; suggesting the code I presented isn't
"clear", recommending returning a vector<string> by value, or equating
returning a vector<string> by value with returning size().
The clearest thing is IMHO returning the result of a function by
using 'return'.
Now, concerning efficiency:
a)
vector const& v = my_function();
b)
vector v;
your_function(v);
Which of those is more efficient? You claim that it's b), but using a modern
compiler they can be equivalent and a) is much clearer because you see
immediately that there is something returned. You might even be able to
drop the reference and it would remain the same code.
I think it's about where you draw the line. If it was not a vector of
strings but a string, would you return it by value? I would. If it
contained the content of a whole file? I wouldn't. How about vector<char>
or vector<int>? Or vector<some_POD>? I can't tell you where one of these or
the original example degrades in performance so far that you can't afford
passing it by value anymore, but until I know that I stay with the clearest
possible code.
You could almost take it on the road, I think. :)
I'm not familiar with that term...
Uli