are scope guards (scope(exit, success, failure)) zero-cost abstractions?

Seb seb at wilzba.ch
Thu Feb 8 12:05:51 UTC 2018


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 
> <kozzi11 at gmail.com> wrote:
>
>> Yes, it add, but is almost zero
>>
>> On Thu, Feb 8, 2018 at 12:00 PM, Timothee Cour via 
>> Digitalmars-d-learn < digitalmars-d-learn at puremagic.com> 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 <digitalmars-d-learn at puremagic.com> 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 at PLT32
		lea	RSI,FLAT:.rodata[00h][RIP]
		lea	RDI,FLAT:.rodata[00h][RIP]
		xor	EAX,EAX
		call	  printf at PLT32
		xor	EAX,EAX
		pop	RBP
		ret
---


More information about the Digitalmars-d-learn mailing list