Dynamic array void initialization
Tom
tom at nospam.com
Tue Mar 8 14:48:37 PST 2011
El 08/03/2011 19:03, Steven Schveighoffer escribió:
> On Tue, 08 Mar 2011 16:53:08 -0500, Ali Çehreli <acehreli at yahoo.com> wrote:
>
>> On 03/08/2011 01:34 PM, Tom wrote:
>>> import std.stdio;
>>>
>>> struct S {
>>> int i;
>>> int j;
>>> }
>>>
>>> int main(string[] args) {
>>> S[] ss = void;
>>> ss.length = 5;
>>> foreach (ref s; ss)
>>> s = S(1, 2);
>>> return 0;
>>> }
>>>
>>> Is the above code correct? (it doesn't work... it blows away or just
>>> give and access violation error).
>>>
>>> I need to create a dynamic array of some struct, but don't want defer
>>> contained elements initialization (for performance reasons).
>>>
>>> Tom;
>>
>> There is std.array.reserve:
>>
>> import std.array;
>>
>> struct S {
>> int i;
>> int j;
>> }
>>
>> int main(string[] args) {
>> S[] ss;
>> reserve(ss, 5);
>>
>> // or if you want to confuse yourself (and me):
>> ss.reserve(5); // same thing as above
>>
>> foreach (ref s; ss)
>> s = S(1, 2);
>>
>> return 0;
>> }
>
> Some clarifications:
>
> it's not std.array.reserve, it's object.reserve, always present, no need
> to import.
>
> I believe if the type contains pointers the GC still writes 0s to the
> unused data to prevent false pointers. However, reserve on an int or a
> struct that just contains ints should not pre-initialize.
>
> reserve ensures appropriate space for appending, it does *not* alter the
> array's length. So your foreach loop would not execute (at that point,
> ss.length is still 0).
>
> To work properly, you would need to use the append operator.
>
> Bearophile has requested an ability to create a dynamic array
> uninitialized, and I think there is a bug report for that. Currently,
> there is no "easy way" to do it.
>
> -Steve
http://d.puremagic.com/issues/show_bug.cgi?id=5603
This is really sad. This kind of stuff is a must for performance. D is
disappointing me too much yet :(
More information about the Digitalmars-d-learn
mailing list