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.