Thread overview
Re: Copy constructor in D. Why it is necessary to have it.
Sep 30, 2008
Eldar Insafutdinov
Sep 30, 2008
bearophile
Sep 30, 2008
BCS
Sep 30, 2008
Bill Baxter
September 30, 2008
Denis Koroskin Wrote:

> On Tue, 30 Sep 2008 23:37:50 +0400, Eldar Insafutdinov <e.insafutdinov@gmail.com> wrote:
> 
> > http://www.everfall.com/paste/id.php?m46jrb36o7qu
> >
> > This is a short example. It has all the comments inside. Since "in" keyword tells the compiler to make a copy of an class object - a new object is created.
> 
> No, that's not true. No heap activity is done under the hood, a copy of
> /pointer/ is passed (as opposed to a copy of /instance/).
> In means that changes to the variable won't be visible to the caller:

In my particular case changes are made to the data behind the pointer - and they are not copied because, only pointer itself is copied. In C++ when you call a function like this:
foo(TClass instance);
copy constructor is called to create a proper copy of an object. "in" keyword means exactly the same I guess? it makes a local copy of an object, so that variable is not supposed to be modified. But in my case since I use a binding to a C-library - the real data is behind the pointer. foo() cannot modify the class fields themself, but since pointer both in variable and local copy point to the same data - the semantics of "in" doesn't work.
>>     auto itCopy = it.clone();
Why copy it manually if language tends to do it so by providing appropriate keyword. I should only write a copy constructor for my data and let to do the rest to the compiler.
September 30, 2008
Eldar Insafutdinov:
> >>     auto itCopy = it.clone();
> Why copy it manually if language tends to do it so by providing appropriate keyword. I should only write a copy constructor for my data and let to do the rest to the compiler.

In D all objects are managed by reference. So when you copy automatically, you are just copying its reference, that's a pointer fully managed by the GC. If you want a copy of the data of an object you ask so to it. This simplifies collections and reduces the number of copies, improving performance.

Instead of "clone()" I suggest "dup", that's the standard in D.

Bye,
bearophile
September 30, 2008
Reply to bearophile,

> Eldar Insafutdinov:
> 
>>>> auto itCopy = it.clone();
>>>> 
>> Why copy it manually if language tends to do it so by providing
>> appropriate keyword. I should only write a copy constructor for my
>> data and let to do the rest to the compiler.
>> 
> In D all objects are managed by reference.

BTW note that structs ARE pass by value.


September 30, 2008
On Wed, Oct 1, 2008 at 5:34 AM, bearophile <bearophileHUGS@lycos.com> wrote:
> Eldar Insafutdinov:
>> >>     auto itCopy = it.clone();
>> Why copy it manually if language tends to do it so by providing appropriate keyword. I should only write a copy constructor for my data and let to do the rest to the compiler.
>
> In D all objects are managed by reference. So when you copy automatically, you are just copying its reference, that's a pointer fully managed by the GC. If you want a copy of the data of an object you ask so to it. This simplifies collections and reduces the number of copies, improving performance.
>
> Instead of "clone()" I suggest "dup", that's the standard in D.
>

It has been pointed out though, that dup is a "shallow copy" in D's built-in usage.  If you want a deep copy operation, there is no precedent in the base language, I believe.  Clone is a good one to standardize on for deep copies, I think.

--bb