pass a struct by value/ref and size of the struct

ZombineDev via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Mar 22 00:35:49 PDT 2016


On Monday, 21 March 2016 at 23:31:06 UTC, ref2401 wrote:
> I have got a plenty of structs in my project. Their size varies 
> from 12 bytes to 128 bytes.
> Is there a rule of thumb that states which structs I pass by 
> value and which I should pass by reference due to their size?
>
> Thanks.

If the object is larger than the size of a register on the target 
machine, it is implicitly passed by ref (i.e. struct fields are 
accessed by offset from the stack pointer). So the question is: 
does the compiler need to create temporaries and is this an 
expensive operation? In C++ the problem is that there are lots of 
non-POD types which have expensive copy constructors (like 
std::vector) and that's why taking objects by const& is good 
guideline. In D structs are implicitly movable (can be memcpy-ed 
around without their postblit this(this) function called) and 
that's why I think that passing by value shouldn't be as large 
problem as in C++, especially if you are using a good optimizing 
compiler such as LDC or GDC.

Anyway, modern hardware in combination with compiler 
optimizations can often suprise you, so I recommend profiling 
your code and doing microbenchmarks to figure out where you may 
have performance problems. In my experience, large amounts of 
small memory allocations is orders of magnitude larger problem 
than the copying of large value types. The next thing to look for 
is inefficient memory layout with lots of indirections.


More information about the Digitalmars-d-learn mailing list