Thread overview | ||||||
---|---|---|---|---|---|---|
|
December 09, 2009 Immutable data not copied | ||||
---|---|---|---|---|
| ||||
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 Re: Immutable data not copied | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tomek Sowiński | 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 Re: Immutable data not copied | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tomek Sowiński | 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 Re: Immutable data not copied | ||||
---|---|---|---|---|
| ||||
Posted in reply to Lutger | 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
|
Copyright © 1999-2021 by the D Language Foundation