On 13/10/2024 6:12 PM, Salih Dincer wrote:
On Saturday, 12 October 2024 at 13:11:52 UTC, Richard (Rikki) Andrew Cattermole wrote:
You are not wrong, when it is a struct, it is being heap allocated.

Sorry for prolonging the topic. I am very curious about your answers along with your patience...

Can we say that structs are in the stack (LIFO) as long as we do not use the new operator? Also, should using scope in structures cause a change? I never seen it does! However, there is no incompatibility here: Whether it is a class or a struct, when you use the new operator, the first run constructor becomes the first run destructor with FIFO logic.

You can reverse this situation with scope (but only in classes). By reverse I don't mean LIFO! In fact, the correct expression is that when you are done with the object, it is removed.

Thanks, SDB@79

Sorry for not replying sooner, COVID has not been a fun virus for my mind to have.

When a variable is declared with a struct that needs cleanup, it effectively rewrites the following statements into a try finally:

```d
void main()
{
        S s = 0;
        try
        {
                if (true)
                        return 0;
        }
        finally
                s.~this();
        return 0;
}
```

There are simplifications of this, without the need for the try finally, but we can ignore it for the purposes of this explanation.

The same can be seen with a class that was allocated on the stack:

```d
void main()
{
        scope C c = new C;
        try
        {
                if (true)
                        return 0;
        }
        finally
                delete c;
        return 0;
}
```

Nested:

```d
void main()
{
        scope C c = new C;
        try
        {
                S s = 0;
                try
                {
                        if (true)
                                return 0;
                }
                finally
                        s.~this();
        }
        finally
                delete c; // aggregate dtor is called
        return 0;
}
```

How nesting destroys fields:

```d
class C : Object
{
        S s;
        scope ~this() // user dtor
        {
        }
        scope ~this() // field dtor
        {
                this.s.~this();
        }
        scope ~this() // aggregate dtor
        {
                // user dtor , field dtor
                this.~this() , this.~this();
        }
}
```

This should cover the ordering on the stack. If you have any further questions about it please ask.

---------------------------------------------

> Also, should using scope in structures cause a change?
> I never seen it does!

The scope attribute in a declaration body such as a struct, class or union applies to the method, for its this pointer. It does not apply to the fields.

Generally speaking, scope should not be on a type or field declaration.

Good:

```d
struct S {
        int fields;

        private shared int* thing;

export @safe nothrow @nogc:

        this() scope {}

        void method1() scope {}

        scope { // ok
                void method2() {}
        }

scope: // no indication at function that it is applied, not great
        void method3() {}
}
```

Bad:

```d
struct S {
export @safe nothrow @nogc scope:

        int fields;

        this() {}

        void method() {}
}

shared scope struct S {
export @safe nothrow @nogc:

        int fields;

        this() {}

        void method() {}
}
```

  • Scope & Stru... Salih Dincer via Digitalmars-d-learn
    • Re: Scope &... Salih Dincer via Digitalmars-d-learn
      • Re: Sco... Nick Treleaven via Digitalmars-d-learn
        • Re:... Salih Dincer via Digitalmars-d-learn
          • ... Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn
    • Re: Scope &... Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn
      • Re: Sco... Salih Dincer via Digitalmars-d-learn
        • Re:... Nick Treleaven via Digitalmars-d-learn
        • Re:... Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn
          • ... Salih Dincer via Digitalmars-d-learn

Reply via email to