On Saturday, 3 October 2020 at 23:00:46 UTC, Anonymouse wrote:
I'm passing structs around (collections of strings) whose
.sizeof returns 432.
The readme for 2.094.0 includes the following:
This release reworks the meaning of in to properly support all
those use cases. in parameters will now be passed by reference
when optimal, [...]
* Otherwise, if the type's size requires it, it will be passed
by reference.
Currently, types which are over twice the machine word size
will be passed by
reference, however this is controlled by the backend and can
be changed based
on the platform's ABI.
However, I asked in #d a while ago and was told to always pass
by value until it breaks, and only then resort to ref.
[18:32:16] <zorael> at what point should I start passing my
structs by ref rather than by value? some are nested in
others, so sizeofs range between 120 and 620UL
[18:33:43] <Herringway> when you start getting stack overflows
[18:39:09] <zorael> so if I don't need ref for the references,
there's no inherent merit to it unless I get in trouble
without it?
[18:39:20] <Herringway> pretty much
[18:40:16] <Herringway> in many cases the copying is merely
theoretical and doesn't actually happen when optimized
I've so far just been using const parameters. What should I be
using?
I don't agree with this, especially if the struct is 432 bytes.
It takes time and memory to copy such structure. I always use
"const ref" when I pass structures because that's only a pointer.
Classes are references by themselves so its not applicable there.
Only "ref" when I want to modify the contents.
However there are some exceptions to this rule in D as D support
slice parameters. In this case you want a copy as slice of the
array, often because the slice is often casted from something
else. Basically the array slice parameter become an lvalue.
This copy of parameters to the stack is an abomination in
computer science and only useful in some cases but mostly not.
The best would be if the compiler itself could determine what is
the most efficient. Nim does this and it was not long ago
suggested that the "in" keyword should have a new life as such
optimization, is that the change that has entered in 2.094.0? Why
wasn't this a DIP?
I even see this in some C++ program code where strings are passed
as value which means that the string is copied including a
possible memory allocation which certainly slow things down.
Do not listen to people who says "pass everything by value"
because that is in general not ideal in imperative languages.