Thread overview
Immutable data not copied
Dec 09, 2009
Tomek Sowiński
Dec 09, 2009
Simen kjaeraas
Dec 09, 2009
Lutger
Dec 09, 2009
Tomek Sowiński
December 09, 2009
const(FAQ) says: "When doing a deep copy of a data structure, the invariant portions need not be copied."
I'm trying to imagine what code would benefit from such optimization.

immutable struct Large { whole lotta data... }

struct Other { Large l; }

void funkcja(Large s);  // no reference annotation on parameter, copied?
{
   Large t = s;   // copied?
   auto other = Other(s);  // copied?
   Other o = other;  // other.l copied?
}


Tomek
December 09, 2009
On Wed, 09 Dec 2009 01:18:46 +0100, Tomek Sowiński <just@ask.me> wrote:

> const(FAQ) says: "When doing a deep copy of a data structure, the invariant portions need not be copied."
> I'm trying to imagine what code would benefit from such optimization.
>
> immutable struct Large { whole lotta data... }
>
> struct Other { Large l; }
>
> void funkcja(Large s);  // no reference annotation on parameter, copied?
> {
>     Large t = s;   // copied?
>     auto other = Other(s);  // copied?
>     Other o = other;  // other.l copied?
> }
>
>
> Tomek

Deep copy means follow references and pointers, so it refers to references and pointers, not POD.

-- 
Simen
December 09, 2009
Tomek Sowiński wrote:

> const(FAQ) says: "When doing a deep copy of a data structure, the
> invariant portions need not be copied."
> I'm trying to imagine what code would benefit from such optimization.
> 
> immutable struct Large { whole lotta data... }
> 
> struct Other { Large l; }
> 
> void funkcja(Large s);  // no reference annotation on parameter, copied?
> {
>     Large t = s;   // copied?
>     auto other = Other(s);  // copied?
>     Other o = other;  // other.l copied?
> }
> 
> 
> Tomek

As Simen kjaeraas said, deep copy is about following references. The optimization mentioned in the faq is not something done automatically by the compiler, but merely made possible by immutable. Here is a naive example:

class ImageEditDocument
{
    immutable(Image)[] layers;
}

Making a copy of such a document for further editing would normally require copying all images in the layers array. If they are immutable, you can just copy the references because you know the images will never be modified.

December 09, 2009
Dnia 09-12-2009 o 09:54:33 Lutger <lutger.blijdestijn@gmail.com> napisał(a):

> Tomek Sowiński wrote:
>
>> const(FAQ) says: "When doing a deep copy of a data structure, the
>> invariant portions need not be copied."
>> I'm trying to imagine what code would benefit from such optimization.
>>
>> immutable struct Large { whole lotta data... }
>>
>> struct Other { Large l; }
>>
>> void funkcja(Large s);  // no reference annotation on parameter, copied?
>> {
>>     Large t = s;   // copied?
>>     auto other = Other(s);  // copied?
>>     Other o = other;  // other.l copied?
>> }
>>
>>
>> Tomek
>
> As Simen kjaeraas said, deep copy is about following references. The
> optimization mentioned in the faq is not something done automatically by the
> compiler, but merely made possible by immutable. Here is a naive example:
>
> class ImageEditDocument
> {
>     immutable(Image)[] layers;
> }
>
> Making a copy of such a document for further editing would normally require
> copying all images in the layers array. If they are immutable, you can just
> copy the references because you know the images will never be modified.

I see, thanks. The point to remember is that you need reference semantics (classes, arrays) to dodge copying gracefully.


Tomek