Which is more efficient: Return a value vs. Pass by reference?
First of all, take in account that returning an object will always be more readable (and very similar in performance) than having it passed by reference, so could be more interesting for your project to return the object and increase readability without having important performance differences. If you want to know how to have the lowest cost, the thing is what do you need to return:
If you need to return a simple or basic object, the performance would be similar in both cases.
If the object is so large and complex, returning it would need a copy, and it could be slower than having it as a referenced parameter, but it would spend less memory I think.
You have to think anyway that compilers do a lot of optimizations which make both performances very similar. See Copy Elision.
Well, one must understand that compilation is not an easy buisness. there are many consideration taken when the compiler compiles your code.
One can't simply answer this question because the C++ standard doesn't provide standard ABI (abstract binary interface), so each compiler is allowed to compile the code whatever it likes and you can get different results in each compilation.
For example, on some projects C++ is compiled to managed extension of Microsoft CLR (C++/CX). since everything there is already a reference to an object on the heap, I guess there is not difference.
The answer is not simpler for un-managed compilations. several quaestion come to mind when I think about "Will XXX run faster then YYY?", for example:
- Is you object deafult-constructible?
- Does your compiler support return-value-optimization?
- Does your object support Copy-only semantics or both copy and move?
- Is the object packed in contigious manner (e.g.
std::array
) or it has pointer to something on the heap? (e.g.std::vector
)?
If I give concrete example, my guess is that on MSVC++ and GCC, returning std::vector
by value will be the as passing it by reference, because of r-value-optimization, and will be a bit (by few nanoseconds) faster then returning the vector by move. this may be completly different on Clang, for example.
eventually, profiling is the only true answer here.
Returning the object should be used in most cases because of an optimsation called copy elision.
However, depending on how your function is intended to be used, it may be better to pass the object by reference.
Look at std::getline
for instance, which takes a std::string
by reference. This function is intended to be used as a loop condition and keeps filling a std::string
until EOF is reached. Using the same std::string
allows the storage space of the std::string
to be reused in every loop iteration, drastically reducing the number of memory allocations that need to be performed.
Some of the answers have touched on this, but I would like to emphasize in light of the edit
For context, this question is limited to hardware platform-independent differences, and for the most part software too. Are there any machine-independent performance difference?
If this is the limits of the question, the answer is that there is no answer. The c++ spec does not stipulate how either the return of an object or a passing by reference is implemented performance wise, only the semantics of what they both do in terms of code.
A compiler is therefore free to optimize one to identical code as the other assuming this does not create a perceptible difference to the programmer.
In light of this, I think it is best to use whichever is the most intuitive for the situation. If the function is indeed "returning" an object as the result of some task or query, return it, while if the function is performing an operation on some object owned by the outside code, pass by reference.
You cannot generalize performance on this. As a start, do whatever is intuitive and see how well your target system and compiler optimizes it. If after profiling you will discover a problem, change it if you need to.