Rvalue references - The resolution

deadalnix deadalnix at gmail.com
Sat May 4 14:22:34 PDT 2013


On Saturday, 4 May 2013 at 19:40:36 UTC, Tove wrote:
> On Saturday, 4 May 2013 at 18:33:04 UTC, Walter Bright wrote:
>> Runtime Detection
>>
>> There are still a few cases that the compiler cannot 
>> statically detect. For these a runtime check is inserted, 
>> which compares the returned ref pointer to see if it lies 
>> within the stack frame of the exiting function, and if it 
>> does, halts the program. The cost will be a couple of CMP 
>> instructions and an LEA. These checks would be omitted if the 
>> -noboundscheck compiler switch was provided.
>
> Thanks for taking the time to detail the solution, I was quite 
> curious.
>
> Runtime Detection and opt-out with "-noboundscheck" is a stroke 
> of genius!
>
> "couple of CMP instructions"
> should be possible to reduce to only one with the "normal" 
> unsigned range check idiom, no?
>
> Looking forwards to hear more cool news. :)

It shouldn't be expensive. Additionally, consider that returning 
by reference is quite rare in practice.

Due to D semantic, returning by reference isn't a performance 
improvement (you get full performance returning by value in D), 
so you only return by reference when you intend to keep identity 
(ie, when you intend to modify a given value, in containers for 
instance).

I still think this is inferior to Rust's solution and like to see 
ref as a equivalent of the Rust burrowed pointer. It achieve the 
same safety at compile time instead at runtime, and incurs no 
extra complexity except in some very rare cases (when you have a 
function taking several arguments by ref and returning also by 
ref and the lifetime of the returned ref isn't the union of the 
lifetime of the ref parameters - a very specific case).

Talking with people at DConf, it seems that many of them didn't 
knew about how Rust solve that issue, and so I'm not sure if we 
should validate the proposal.

At a first glance, it seems that the proposal allow for rather 
painless later inclusion of the concept of burrowed pointer, and 
we can ensure that this is effectively the case, I'm definitively 
for it.

But we shouldn't close the door to that concept. After all, D is 
about doing as much as possible at compile time, and when we have 
the choice to trade a runtime check against a compile time one, 
we must go for it.


More information about the Digitalmars-d mailing list