Thoughts about D
Walter Bright
newshound2 at digitalmars.com
Fri Dec 1 03:23:23 UTC 2017
On 11/30/2017 3:51 PM, Nicholas Wilson wrote:
> On Thursday, 30 November 2017 at 18:18:41 UTC, Jonathan M Davis wrote:
>> But I have a hard time believing that the cost of assertions relates to
>> constructing an AssertError unless the compiler is inlining a bunch of stuff
>> at the assertion site. If that's what's happening, then it would increase the
>> code size around assertions and potentially affect performance.
>>
>> - Jonathan M Davis
>
> Indeed, if DMD is not marking the conditional call to _d_assert (or whatever it
> is) 'cold' and the call itself `pragma(inline, false)` then it needs to be
> changed to do so.
Instead of speculation, let's look at what actually happens:
---------------------------------
void test(int i) {
assert(i, "message");
}
---------------------------------
dmd -c -m64 -O test
obj2asm -x test.obj
---------------------------------
__a6_746573742e64:
db 074h,065h,073h,074h,02eh,064h,000h ;test.d.
__a7_6d657373616765:
db 06dh,065h,073h,073h,061h,067h,065h,000h ;message.
_D4test4testFiZv:
0000: push RBP
0001: mov RBP,RSP
0004: sub RSP,040h
0008: mov 010h[RBP],ECX
000b: cmp dword ptr 010h[RBP],0
000f: jne $+3Ah
--- start of inserted assert failure code ---
0011: mov R8D,5 // line number
0017: lea RAX,FLAT:_BSS[00h][RIP]
001e: mov -018h[RBP],RAX // filename.ptr
0022: mov qword ptr -020h[RBP],6 // filename.length
002a: lea RDX,-020h[RBP] // &filename[]
002e: lea RCX,FLAT:_BSS[00h][RIP]
0035: mov -8[RBP],RCX // msg.ptr
0039: mov qword ptr -010h[RBP],7 // msg.length
0041: lea RCX,-010h[RBP] // &msg[]
0045: call L0
--- end of inserted assert failure code ---
004a: mov RSP,RBP
004d: pop RBP
004e: ret
-------------------------------------------
26 bytes of inserted Bloaty McBloatface code and 15 bytes of data. My proposal:
_D4test4testFiZv:
0000: push RBP
0001: mov RBP,RSP
0004: sub RSP,040h
0008: mov 010h[RBP],ECX
000b: cmp dword ptr 010h[RBP],0
000f: jne $+01h
0011: hlt // look ma, 1 byte!
0012: mov RSP,RBP
0015: pop RBP
0016: ret
1 byte of inserted code, and the data strings are gone as well.
More information about the Digitalmars-d
mailing list