How to overload member function pointer and a regualr member function
Basile B. via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Apr 26 01:24:08 PDT 2017
On Tuesday, 25 April 2017 at 18:58:58 UTC, Ali Çehreli wrote:
> On 04/25/2017 11:54 AM, Ali Çehreli wrote:
> My analysis is wrong because that writefln() is for the
> bar(float) overload but I still think what you want is achieved.
>
> Ali
No it's ok, it works. The additional indirection is well avoided:
Let's take this module:
==================
#!dmd -release -inline -O
module runnable;
struct Foo
{
private void function(int,float) _bar;
void bar(float){}
pragma(inline, false) void bar(int i, float f){_bar(i,f);}
}
struct FooInline
{
private void function(int,float) _bar;
void bar(float){}
pragma(inline, true) void bar(int i, float f){_bar(i,f);}
}
void testInlined(ref FooInline foo)
{
foo.bar(0,0);
}
void test(ref Foo foo)
{
foo.bar(0,0);
}
void main()
{
import disassembler, std.stdio;
disassembler.symbolTable.addModule!runnable;
prettyDisasm(&testInlined).writeln;
prettyDisasm(&test, 2).writeln; // dig up to 2 levels,
required for the indir.
}
==================
and looks at the output:
;------- SUB 0000000000459970h -------
; NAMED: testInlined
0000000000459970h push rbp
0000000000459971h mov rbp, rsp
0000000000459974h sub rsp, 20h
0000000000459978h mov qword ptr [rbp-08h], rdi
000000000045997Ch xor edi, edi
000000000045997Eh mov dword ptr [rbp-20h], edi
0000000000459981h movss xmm0, dword ptr [rbp-20h]
0000000000459986h mov rax, qword ptr [rbp-08h]
000000000045998Ah call qword ptr [rax]
000000000045998Dh mov rsp, rbp
0000000000459990h pop rbp
0000000000459991h ret
;-------------------------------------
;------- SUB 0000000000459934h -------
; XREFS: [00000000004599A6h]
0000000000459934h push rbp
0000000000459935h mov rbp, rsp
0000000000459938h sub rsp, 10h
000000000045993Ch mov qword ptr [rbp-08h], rdi
0000000000459940h mov rdi, rsi
0000000000459943h mov rax, qword ptr [rbp-08h]
0000000000459947h call qword ptr [rax]
000000000045994Ah mov rsp, rbp
000000000045994Dh pop rbp
000000000045994Eh ret
;-------------------------------------
;------- SUB 0000000000459994h -------
; NAMED: test
0000000000459994h push rbp
0000000000459995h mov rbp, rsp
0000000000459998h sub rsp, 10h
000000000045999Ch xor esi, esi
000000000045999Eh mov dword ptr [rbp-10h], esi
00000000004599A1h movss xmm0, dword ptr [rbp-10h]
00000000004599A6h call 0000000000459934h
00000000004599ABh mov rsp, rbp
00000000004599AEh pop rbp
00000000004599AFh ret
;-------------------------------------
- testInlined() contains only the delegate call. (call qword ptr
[rax])
- test() contains a call (call 0000000000459934h) which contains
the
delegate call (call qword ptr [rax])
Actually i've even had to add (pragma inline false) to show the
difference since DMD inlined automatically bar() in test().
More information about the Digitalmars-d-learn
mailing list