On Friday, 21 September 2012 at 03:46:12 UTC, Andrei Alexandrescu wrote:
I've met Matt Goldbolt, the author of the GCC Explorer at http://gcc.godbolt.org - a very handy online disassembler for GCC.

We got to talk a bit about D and he hacked together support for D by using gdc. Take a look at http://d.godbolt.org, I think it's pretty darn cool! I'm talking to him about integrating his work with our servers.


Andrei

Compare a simple C++ to D and the C++ output is far better:

class C
{
    int x = 12;
    public:
        int foo(int y) { return y*x; }
};

int main()
{
   C* c = new C();
   return c->foo(2);
}



VS




class C
{
    int x = 12;
    public:
        int foo(int y) { return y*x; }
};

int main()
{
   C c = new C();
   return c.foo(2);
}








operator new(unsigned long)@plt:
jmp QWORD PTR [rip+0x200baa] # 601020 <operator new(unsigned long)@GLIBCXX_3.4>
 push   0x1
 jmp    400450 <.plt>
main:
 push   rbp
 mov    rbp,rsp
 push   rbx
 sub    rsp,0x18
 mov    edi,0x4
 call   400470 <operator new(unsigned long)@plt>
 mov    rbx,rax
 mov    DWORD PTR [rbx],0x0
 mov    rdi,rbx
 call   4005bc <C::C()>
 mov    QWORD PTR [rbp-0x18],rbx
 mov    rax,QWORD PTR [rbp-0x18]
 mov    esi,0x2
 mov    rdi,rax
 call   4005a4 <C::foo(int)>
 nop
 add    rsp,0x18
 pop    rbx
 pop    rbp
 ret
 nop
C::foo(int):
 push   rbp
 mov    rbp,rsp
 mov    QWORD PTR [rbp-0x8],rdi
 mov    DWORD PTR [rbp-0xc],esi
 mov    rax,QWORD PTR [rbp-0x8]
 mov    eax,DWORD PTR [rax]
 imul   eax,DWORD PTR [rbp-0xc]
 pop    rbp
 ret
 nop
C::C():
 push   rbp
 mov    rbp,rsp
 mov    QWORD PTR [rbp-0x8],rdi
 mov    rax,QWORD PTR [rbp-0x8]
 mov    DWORD PTR [rax],0xc
 nop
 pop    rbp
 ret
 nop    WORD PTR cs:[rax+rax*1+0x0]
 nop    DWORD PTR [rax+rax*1+0x0]




VS










_Dmain:
 push   rbp
 mov    rbp,rsp
 sub    rsp,0x10
 mov    rdi,QWORD PTR [rip+0x0]        # f <_Dmain+0xf>
 call   14 <_Dmain+0x14>
 mov    QWORD PTR [rbp-0x8],rax
 mov    esi,0x2
 mov    rdi,rax
 mov    rax,QWORD PTR [rax]
 rex.W call QWORD PTR [rax+0x28]
 leave
 ret
 add    BYTE PTR [rax],al
main:
 push   rbp
 mov    rbp,rsp
 sub    rsp,0x10
 mov    DWORD PTR [rbp-0x10],edi
 mov    QWORD PTR [rbp-0x8],rsi
 mov    rdx,QWORD PTR [rip+0x0]        # 16 <main+0x16>
 mov    rsi,QWORD PTR [rbp-0x8]
 mov    edi,DWORD PTR [rbp-0x10]
 call   22 <main+0x22>
 leave
 ret
.text.d_dso_init:
 push   rbp
 mov    rbp,rsp
 lea    rax,[rip+0x0]        # b <.text.d_dso_init+0xb>
 push   rax
 lea    rax,[rip+0x0]        # 13 <.text.d_dso_init+0x13>
 push   rax
 lea    rax,[rip+0x0]        # 1b <.text.d_dso_init+0x1b>
 push   rax
 push   0x1
 mov    rdi,rsp
 call   26 <.text.d_dso_init+0x26>
 leave
 ret


the C++ version is more verbose, gives explicit references to functions and methods while the D version requires you to hunt and peck.

Reply via email to