On Thu, 31 Jan 2013 11:17:14 -0500, Andrei Alexandrescu <[email protected]> wrote:

On 1/31/13 11:00 AM, Steven Schveighoffer wrote:
On Thu, 31 Jan 2013 10:40:15 -0500, Andrei Alexandrescu
<[email protected]> wrote:
It has a destructor.

One which is not called if allocated on the heap.

That is correct. My point was that with structs we get to implement full-fledged reference counting for containers.

But that won't work if the struct is on the heap. You will leak the memory.

Not only that, but if the container uses the GC to allocate nodes, calling the destructor during the GC cycle would be a bad thing.

Reference counting makes a lot of sense for containers. They inherently own their internals, don't have cycles, and are massive enough to make pass by value effectively an anti-pattern (as it is for C++). At the same time memory reclamation is of high interest. Reference counting is really the sweet spot for containers.

Reference counting makes a lot of sense for any reference type. Including classes.

I think your point is that we can do reference counting with structs, and we can't with classes. I think:

a) you can do reference counting with both (at the moment, this requires a wrapper struct for the class) b) structs that depend on destruction to free their memory do not work with the current runtime implementation.

It's possible to make a class reference that is destroyed when going out
of scope. Then you have the option, heap destroyed or stack destroyed.

Not possible with structs (at least for now).

I don't understand this. Is it about the deprecated meaning of scope?

It means, classes have a mechanism for destruction via the heap (GC) or via the stack (scope, or whatever currently replaces scope (Scoped? I can't remember) ).

Structs by default are easily destroyed from the stack, but lack the fundamental cogs to get GC-based destruction.

In other words, you can't put a reference-counted struct on the heap, it won't work correctly (the destructor won't get called). This is not to say this can't be fixed, but if we are talking about current implementation limitations, classes are superior in how they can be used.

-Steve

Reply via email to