Re: How to return a reference, when I really need it
"Yannick Tremblay" <ytrembla@nyx.nyx.net>
In article <h4ur7t$1o5b$1@news.ett.com.ua>, Balog Pal <pasa@lib.hu> wrote:
"BlackLight" <blacklight86@gmail.com>
yeah, returning a vector, and by value is (on top of being way
inefficient) .
Please, this is incorrect !
Returning vector by value is not "way inefficient" in the general case.
This forum starts acting weird, within few days I observe several claims
that positive numbers are not necessarily greater than zero. :-o
returrning a vector filled with a copy of a row IS inefficient compared to
retrirning a reference to that row. In ANY case. Sorry if that breaks
anyones world, but that is simple fact that optimizing away *more* copies
over the first will not eliminate. 1 copy on dynamic store is more than 0
copies.
It may even be faster and more efficient than returning by reference
in the majority of usage scenario because of the capability of the
compiler to optimise away any superflous copy and allocation via RVO.
You're probably creating some strowman example for comparision instead of
looking the original context of the statement.
So the following is probably the fastest in a large set of very common
usage scenario.
---------------------------------------------------
std::vector<double> iReturnALargeVector();
int main()
{
std::vector<double> v = iReturnALargeVector();
}
---------------------------------------------------
In addition to the speed benefits, the above is very simple to write,
very simple to maintain and is far least likely to hide a subtle bugs
than returning a reference to internal data.
Your additional benefits are made up, and the rest belongs to a different
discussion that is not denied, but was not in the scope.
And OP's original problem was that he wants to MODIFY the content of the
original container, not poking a copy of it, so this would not apply as
solution even if everything else was true.
Returning a reference to internal data to a class (possibly using a
proxy) may in some circumstances have speed benefits. But is has very
significant drawbacks because of the risk it introduce in the code.
that is well described in Meyers, Sutter and other morality guides. Still if
you want an interface where the stuff behaves like lvalue, you don;t have
too many options. The traditional Set...( value ) like interface avoids
certain traps, but may force client code to a suboptimal look. Even if
you have all the luck with the optimization.
Designing a good interface measuring all the attributes against each other
never was a trivial task. I suggested OP to read and analyze existing
libraries for a good reason.