Anyway to achieve the following

Johan j at j.nl
Sun Aug 15 17:18:14 UTC 2021


On Sunday, 15 August 2021 at 16:49:22 UTC, Paul Backus wrote:
> On Sunday, 15 August 2021 at 07:10:17 UTC, JG wrote:
>>
>> Hi,
>>
>> This is exactly the behaviour I was trying to obtain.
>>
>> It however comes with a fair amount of overhead, as can be 
>> seen in the following llvm ir:
>>
>> [...]
>
> I'm not really familiar with llvm ir, but looking at it on 
> godbolt, it seems like the main difference is that taking the 
> address of `s.x` forces the compiler to place `s` in memory, 
> rather than keeping it entirely in registers:
>
> https://d.godbolt.org/z/1afbsM6fv

The function `std.stdio.writeln!(example.Ref!(int))` is not 
trivial. I doubt there is a reasonable 
optimization/transformation path from a call to 
`std.stdio.writeln!(example.Ref!(int))` to a call to 
`std.stdio.writeln!(int).writeln(int)`.
Without being able to simplify it to that call, `s` has to be put 
in memory. It's the opaqueness of 
`std.stdio.writeln!(example.Ref!(int))` and that it (must) takes 
the address of `s.x` as parameter.

-Johan



More information about the Digitalmars-d-learn mailing list