Give struct the status it deserves

Hong Hong_member at pathlink.com
Sun Mar 26 06:06:48 PST 2006


I hope you really know what you are talking about.

In article <e06353$7o9$1 at digitaldaemon.com>, Alexander Panek says...
>
>Hong wrote:
>> Structs are second class citizens of... or maybe refugees of D, they are victims
>> of discrimination.
>> Following are the reasons:
>> 
>> 1. most D programmers don't use struct, unless they happen to be the poor guy
>> writing the C interface.
>> 
>I don't know, but are you aware of what a struct is used for? It 
>encapsules data and provides an easy access to chunks of data related to 
>one bunch of information / object.
>
>> 2. to use structs you have to use pointers, but the spec says pointers are only
>> provided for C compatibility, structs are to be avoided as long as the world
>> spins.
>> 
>Who in the world told you not to use pointers? I haven't seen that in 
>the documentation, sorry.
>
>> 3. pointers + overloaded operators make a mess.... this is a less offensive
>> example: (*o) = (*t)[(*i) * (*j)] ... the pointers and operators are abusing
>> each other.
>> 
>> 4. structs cannot have constructor, "static opCall" is best you can do.
>> 
>Take a look at std.boxer, there you have a constructor like 
>function/template.
>
>> 5. structs are more efficient? Not when structs are passed around by value. To
>> change a struct member: 1. make a copy 2. change the copy 3. Copy the copy back
>> into the original location. Two damned copies for.... efficiency.
>> 
>As said, I can't find anything in the documentation that says you should 
>not use pointers.
>
>"Structs and unions are meant as simple aggregations of data, or as a 
>way to paint a data structure over hardware or an external type. 
>External types can be defined by the operating system API, or by a file 
>format. Object oriented features are provided with the class data type."
>-- http://www.digitalmars.com//d/struct.html
>
>> 6. yes, you can use pointers to change a struct member without copying, if you
>> can be bothered to define 2 accessor methods, one returns a copy another one
>> returns a pointer.
>> 
>What's the problem here? Same goes with classes.
>
>> 7. Most standard containers (DTL) do not allow a pointer to a contained struct
>> to be retrieved, all changes, or just about anything has to be done via copies.
>> 
>> 8. structs have different behaviours between array and Vector, array [] returns
>> a reference, Vector [] returns a copy, nice rookie trap.
>> 
>A Vector is no array, keep that in mind. There're still pointers, you 
>know? ;)
>
>> 
>> Imho, following are little suggestions for structs to make first class citizens
>> of D:
>> 
>> 1. have some sort of reference semantic to replace pointers. Pointers are not
>> necessary unless structs are used with "new"
>> 
>Pointers *are* necessary. D is a high level language, of course, but 
>also provides the ability to write low level code. And structs, as they 
>*are*, are a very important part of this ability.
>
>> 2. add constructor for struct, destructors are not necessary.
>> 
>As said before.
>
>> I use structs because I need efficiency and stack allocated data structures,
>> however, it is painful to see a C++ program turns into a C like program when
>> ported to D.
>> 
>You can also provide effient code with classes, if you feel your code is 
>'ugly' with structs. Also, structs should not be abused. Structs are 
>structs and classes are classes - they both have their specific 
>purposes, one should not forget that.
>
>Regards,
>Alex
>
>PS: No offense intended.





More information about the Digitalmars-d mailing list