"ref const" parameters in functions

L-MAN vangelisforever at yandex.ru
Sun Apr 1 23:22:27 PDT 2012


On Monday, 2 April 2012 at 05:03:48 UTC, Jonathan M Davis wrote:
> 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
  Thank you)) it's very good for me))



More information about the Digitalmars-d-learn mailing list