"ref const" parameters in functions
Jonathan M Davis
jmdavisProg at gmx.com
Sun Apr 1 22:03:34 PDT 2012
On Sunday, April 01, 2012 21:23:50 Jonathan M Davis wrote:
> On Monday, April 02, 2012 05:46:24 L-MAN wrote:
> Sure, if you have large structs, making a lot of copies of them can be
> expensive. But to avoid that, you're going to have to avoid coding in a way
> which creates temporaries, and expressions like
>
> (abc1+abc2*20.0)+(abc1*abc2+abc1*20.0)
>
> will _always_ create temporaries. The classic, arithmetic operators are
> classic examples of functions which create temporaries (all of which are
> rvalues). So, you can't code that way and expect to avoid temporaries.
I should point out that with optimizations turned on, in some cases the
compiler can optimize out the copying of temporaries, though not generally the
temporaries themselves. For instance
auto a = abc1 + abc2 * 20.0
results in a temporary for the result of * and a temporary for the result of
+. But the temporary for the result of + will be optimized out (probably even
without turning on optimizations), because you're using that result to
initialize a variable. And while the result of * will result in a temporary,
the copy that gets made when it's passed to opBinary!"+" should be optimized
out when compiled with optimizations turned on. So, the optimizer should be
able to reduce the problem a fair bit if you compile with -O. -inline may be
able to reduce it even further. So, with optimizations turned on, you may not
get anywhere near as many copies as you expected.
And using auto ref for the parameters (which is easy with the overloaded
arithmetic operators, since they're already templated) should also help reduce
the number of copies made, but it _is_ up to the compiler whether it makes a
copy or not with auto ref, so that depends on the compiler.
So, you should be able to reduce the number of copies simply by compiling with
-O and -inline, but the temporaries themselves will exist regardless.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list