The Demise of Dynamic Arrays?!
Lars T. Kyllingstad
public at kyllingen.NOSPAMnet
Tue Dec 15 00:15:17 PST 2009
S wrote:
> Excuse me, because I haven't been active in the D community the last
> year due to school concerns. However, I have been fiddling with the
> language and on this newsgroups since 2001.
>
> As I understand it, dynamic arrays are going away soon in D2.0 in favor
> of an ArrayBuilder class.
>
> I don't like it at all. I want to stomp my feet and throw a temper
> tantrum. As far as I am concerned, T[] has always been an
> array-builder. Now, I'd appreciate some considering, and that you'll
> excuse my poor phrasing when it comes to terminology (I am not a trained
> computer scientist).
>
> For the last 9 years there has been problems with dynamic arrays. Now,
> I intend to enumerate the problems I have encountered and propose some
> solutions, but let me first describe the internals of the D Arrays as I
> understand them: (To simplify)
>
> struct Array(T) {
> T* ptr;
> uint length;
> }
>
> So, D basically wraps this with various syntatic sugar. Now, there
> have been a variety of probelsm with using this same type for dynamic
> arrays:
>
> 1) It has failed as an array builder because it does not contain the
> length of the memory it references AS WELL as the actually number of
> elements stored. Thus cannot do pre-allocation like vector<> in C++STL
> without some GC magic. This make it slow to append.
>
> 1-Solution) So, add an additional real_length parameter to dynamic
> arrays.....
>
> 2) If you take a slice, it often doesn't behave as expected. Implement
> a new type T[..] that are specifically slices of other arrays. This
> will add another parameter that references the array the slice came
> from. Thus, appending to a slice can behave as an insertion into it's
> parent and other syntatic niceties.
>
> 2-Solution) I propose that this type Arr[..] would be implicitely
> castable to other array types, at the expense of a dup.
>
> 3) If dynamic arrays are passed, they pass the aformentioned struct
> "by-value." This however results in the ptr NOT being shared by the
> function and its caller. So, if a receiving function tries to append
> to them it is possible that the sender doesn't notice the array has been
> moved by the memory manager.
>
> 3-Solution) So, since static arrays are now pass-by-value. Make this
> true for dynamic arrays also, and provide a warning of some sort.
> This would give you the expected read-only sematics of passing values
> instead of the C one where [] == *. Instead the proper way to pass a
> read-write dynamic array would be by reference (AKA a Handle ...
> Computer Scientists solved this problem along time ago:
> http://en.wikipedia.org/wiki/Handle_%28computing%29 ). Now, this
> causes some overhead in terms fo double look-ups for classes which might
> not need to change the pointer address -- maybe there is some way around
> doing this also though?
>
>
> ********* Did I miss anything? Maybe my solutions are incomplete?
> Please comment and revise this. I think it would be a shame to get
> rid of the syntatic sugar of dynamic arrays in support of an
> ArrayBuilder class/struct.
>
> -S.
This page describes the current future plans for D2 and Phobos, and is
actually pretty much up-to-date:
http://www.prowiki.org/wiki4d/wiki.cgi?LanguageDevel
The section "Probably no longer required" near the bottom contains some
links to the array discussions.
-Lars
More information about the Digitalmars-d
mailing list