Efficient way to pass struct as parameter

Cecil Ward d at cecilward.com
Thu Mar 15 23:14:14 UTC 2018


On Tuesday, 2 January 2018 at 18:21:13 UTC, Tim Hsu wrote:
> I am creating Vector3 structure. I use struct to avoid GC. 
> However, struct will be copied when passed as parameter to 
> function
>
>
> struct Ray {
>     Vector3f origin;
>     Vector3f dir;
>
>     @nogc @system
>     this(Vector3f *origin, Vector3f *dir) {
>         this.origin = *origin;
>         this.dir = *dir;
>     }
> }
>
> How can I pass struct more efficiently?

This isn't a question for you. it's a question for the compiler, 
let the compiler do its thing. Stick in a -O3 if you are using 
GCC or LDC and build in release more not debug mode. Make sure 
that the compiler can see the source code of the implementation 
of the constructor wherever it is used and it should just be 
inclined away to nonexistence. Your constructor should not even 
exist, if it is then you are looking at a false picture or a 
mistake where optimisation has been turned off for the sake of 
easy source-level debugging.

Post up the assembler language output for a routine where this 
code is used in some critical situation, and then we can help 
make sure that the code _generation_ is optimal.

I reiterate, unless something is badly wrong or you are seeing a 
red herring, no 'call' to the constructor code should even exist 
in the cases where it is actually 'called'. You may well see a 
useless copy of the constructor code because the compilers seem 
to generate such even though it is never called ans so is a waste 
of space. The compiler will analyse the constructor's 
instructions and just copy-and-paste them as assignment 
statements with that then getting thoroughly optimised down into 
something which may just be a memory write or a register-register 
copy that costs zero.

If you post up snippets of generated asm then U will be delighted 
to take a look.


More information about the Digitalmars-d-learn mailing list