Efficiently passing structs

bitwise via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon May 4 19:47:02 PDT 2015


On Mon, 04 May 2015 00:16:03 -0400, Jonathan M Davis via  
Digitalmars-d-learn <digitalmars-d-learn at puremagic.com> wrote:
> D will move the argument if it can rather than copying it (e.g. if a
> temporary is being passed in), which reduces the need for worrying about
> copying like you tend to have to do in C++98, and I think that a lot of D
> code just doesn't worry about the cost of copying structs.

How exactly would you move a struct? Just a memcpy without the postblit?

> However, if you have a large object that you know is going to be
> expensive to copy, you're either going to have to use const ref
> (and thus probably duplicate the function to allow rvalues), or
> you're going to need to make it a reference type rather than
> having all of its data live on the stack (either by making
> it so that the struct contains a pointer to its data or by making it a
> class).
> In general, if you're dealing with a type that is going to be
> expensive to copy, I'd advise making it a reference type over relying on
> const ref simply because it's less error-prone that way. It's trivial to
> forget to use ref on a parameter, and generic code won't use it, so it'll
> generally work better to just make it a reference type.
>
> - Jonathan M Davis

Something like a Matrix4x4 lives in an awkward place between a class and a  
struct. Because of the fact that a graphics engine may have to deal with  
thousands of them per frame, both copying them at function calls, and  
allocating/collecting thousands of them per frame, are both unacceptable.

I was reading up(DIP36, pull requests, forum) and it seems like auto ref  
was supposed to do something like this. Is there a reason you didn't  
mention it?

Why not just add "rvref" to D?

"rvref" would be the same as ref, but would accept an lvalue or an rvalue  
without copying. You could make it const, scope, or whatever you want. It  
would be unsafe if used incorrectly, but thats what regular "ref" is for.  
I suppose additional security could be added though, like making "rvref"  
escape-proof by default. This would introduce no breaking changes and  
facilitate efficient passing of structs.

   Bit


More information about the Digitalmars-d-learn mailing list