structs as large stack allocated objects vs structs as "pass by value" objects.

Rikki Cattermole alphaglosined at gmail.com
Sun Feb 23 17:17:16 PST 2014


On Sunday, 23 February 2014 at 14:36:36 UTC, Arlon Brandy wrote:
> Today I hit two problems essentially which got me thinking 
> about how structs are used in D by most of the code I've seen 
> so far. Both problems are in:
>
> http://d.puremagic.com/issues/show_bug.cgi?id=9513
>
> So the RedBlackTree create excessive copies of large structs 
> via binaryFun, that and the obvious workaround also 
> necessitates use of a template. It seems that people use 
> structs to indicate one of two things, they want a type they 
> can pass around and return by copy such as vectors/matrices 
> etc. or just a way to allocate something on the stack, usually 
> because of the need for deterministic resource handling or for 
> performance reasons.
>
> One of the great things about the D is that it allows you to 
> specify with the type how it should be used by choosing struct 
> vs class, so you can say at the same time whether the data 
> should be stored on the heap and whether it should be passed by 
> copy or by reference.
>
> It seems to me that it might nice also to have a sub-division 
> within the "struct" to allow the user to indicate a struct that 
> should be passed by reference also like a class. It could be 
> the same in every way except it's always passed by reference 
> and people would have to write their own dup or something for 
> when they want to copy it.
>
> This could also solve the problem of:
>
>     functionWithRefParams(LargeStruct.init, LargeStruct.init)
>
> These new structs would always be passed by reference, and I 
> guess lvalues would be transformed to temporary stack objects 
> by the compiler so that they never have to be copied. To me the 
> "scope ref" proposal looks a bit like C++ rvalue references and 
> I thought this might be simpler and more useful but I don't 
> know it's probably not a good idea.

There is also a work around (I can't remember who posted it 
originally) but to move a struct to heap its basically:

struct T {}
T t;
T* ptrT = [t].ptr;


More information about the Digitalmars-d mailing list