Creating dynamic arrays of known size
H. S. Teoh
hsteoh at quickfur.ath.cx
Fri Mar 9 10:31:11 PST 2012
On Fri, Mar 09, 2012 at 03:10:21PM +0100, Andrej Mitrovic wrote:
> Isn't this just as good?
>
> Key[] keys;
> keys.reserve(num_keys)
> foreach (key; keys_in_aa)
> keys ~= key;
I suppose that should work.
Although it does open up a new can of worms: reserve is @system and also
impure. I can see why, because it interacts with the GC, so by
definition it affects state outside of itself. But if language-level
constructs such as arrays use the GC, does that then make them impure?
That doesn't seem like a good idea (can't use arrays in pure functions
-- seems unnecessarily limiting). Alternatively, can reserve() be made
pure? Since in a sense it "only affects the array".
At the very least, can reserve be made @trusted?
Currently, all of this causes AA.keys and AA.values to be impure and
@system, which seems a bit extreme to me. (Again, comes back to the
point of language-level constructs: AA.keys/.values can't be used in
pure functions; seems unnecessarily limiting.)
On Fri, Mar 09, 2012 at 09:39:16AM -0500, Steven Schveighoffer wrote:
> On Fri, 09 Mar 2012 01:59:34 -0500, Jonathan M Davis
> <jmdavisProg at gmx.com> wrote:
[...]
> >I see two options. Allocate the entire array, set the length to 0,
> >and use assumeSafeAppend (or maybe the function that it uses, since
> >assumeSafeAppend is in _object.d) so that appending doesn't cause
> >reallocations, or create the array as mutable and then cast it to the
> >appropriate type.
> >
> >1.
> >
> >auto keys = new Key[](num_keys);
> >keys.length = 0;
> >assumeSafeAppend(keys);
> >for(i; 0 .. num_keys)
> > keys ~= ...;
> >
> >2.
> >
> >auto keys = new (Unqual!Key)[](num_keys);
> >foreach(ref key; keys)
> > key = ...;
> >
> >auto actualKeys = cast(Key[])keys;
>
> Use the second method. This is low-level runtime code, it should be
> as fast as possible. Casting is OK as long as it's justified.
[...]
OK.
T
--
What doesn't kill me makes me stranger.
More information about the Digitalmars-d
mailing list