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

Arlon Brandy arlon at cheruff.com
Sun Feb 23 06:36:35 PST 2014


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.


More information about the Digitalmars-d mailing list