On Thursday, 8 February 2018 at 11:23:43 UTC, Daniel Kozak wrote:
I mean scope(success), for scope(exit) there is no speed penalty

On Thu, Feb 8, 2018 at 12:03 PM, Daniel Kozak <[email protected]> wrote:

Yes, it add, but is almost zero

On Thu, Feb 8, 2018 at 12:00 PM, Timothee Cour via Digitalmars-d-learn < [email protected]> wrote:

I know that, my question is whether it adds any runtime overhead over naive way (which is to call the "bar" finalizer before each return statement) in the case where no exception is thrown


On Thu, Feb 8, 2018 at 2:44 AM, Mike Parker via Digitalmars-d-learn <[email protected]> wrote: > On Thursday, 8 February 2018 at 10:09:12 UTC, Timothee Cour > wrote:
>>
>> I'm curious whether scope guards add any cost over the >> naive way, eg:
>>
>> ```
>> void fun(){
>>   ...
>>   scope(success) {bar;}
>>   ...
>> }
>> ```
>>
>> vs:
>>
>> ```
>> void fun(){
>>   ...
>>   if(foo1){
>>     bar;  // add this before each return
>>     return;
>>   }
>>   ...
>>   bar;
>>   return;
>> }
>> ```
>>
>> For scope(success) and scope(failure), the naive way would >> anyway >> involve try/catch statements but what about scope(exit)? >> Does the >> zero-cost exception model (zero cost being for non-thrown >> exceptions) >> guarantee us that scope(success) has 0 overhead over naive >> way?
>
>
> Scope guards are lowered to the equivalent > try/catch/finally blocks
anyway.

Yes, it's easy to see this when looking at the lowered AST and ASM.

1) AST

https://run.dlang.io/is/KNJbnP

---
import object;
import core.stdc.stdio;
void main()
{
        printf("%s", "All good.");
        printf("%s", "FOO");
        return 0;
}
---

2) ASM

https://run.dlang.io/is/bIVYvi

---
_Dmain:
                push    RBP
                mov     RBP,RSP
                lea     RSI,FLAT:.rodata[00h][RIP]
                lea     RDI,FLAT:.rodata[00h][RIP]
                xor     EAX,EAX
                call      printf@PLT32
                lea     RSI,FLAT:.rodata[00h][RIP]
                lea     RDI,FLAT:.rodata[00h][RIP]
                xor     EAX,EAX
                call      printf@PLT32
                xor     EAX,EAX
                pop     RBP
                ret
---

Reply via email to