On 06 Jan 2016 3:25 PM, "Minas Mina via Digitalmars-d-announce" <
digitalmars-d-announce@puremagic.com> wrote:
>
> On Wednesday, 6 January 2016 at 12:19:45 UTC, Jacob Carlborg wrote:
>>
>> On 2016-01-05 15:44, Minas Mina wrote:
>>
>>> It won't, but to use it again you need to allocate a new one (If I'm not
>>> mistaken).
>>
>>
>> Not explicitly. I don't know if the runtime allocates a new one. This
works:
>>
>> void main()
>> {
>>     auto foo = ["foo" : 1];
>>     foo = null;
>>     foo["bar"] = 2;
>>     assert(foo["bar"] == 2);
>> }
>
>
> I believe it does, check out this example:
> import std.stdio;
>
> class C
> {
>     int[int] squares;
> }
>
> void main()
> {
>     auto squares = [0 : 0, 1 : 1];
>
>     C c = new C();
>     c.squares = squares;
>
>     writeln(c.squares is squares); // true
>
>     squares = null;
>     squares[10] = 100;
>     writeln(c.squares is squares); // false
> }
>
> If the runtime used the same underlying memory, the second writeln()
would print true, right?
> So if I am correct, a new AA is allocated.
Probably depends on the current implementation. If you are using an
associative array you are going to be allocating at least a little.

If you used an associative array backed by two arrays you could allocate
and reuse memory when null is assigned. It would also be able to keep its
insertion order.

Reply via email to