What's wrong with D's templates?

bearophile bearophileHUGS at lycos.com
Fri Dec 18 17:07:57 PST 2009


Yigal Chripun:

> .Net generics for example work by creating an instantiation for each 
> value type (same as c++ templates) and one instantiation for all 
> reference types since at the binary level all reference types are simply 
> addresses. C++ can't do this since it has no separation between 
> "structs" and "classes".
> there is no casting involved since the full type info is stored.
> so a Foo<Bar> will be typed as Foo<Bar> at the binary level as well and 
> you can use APIs to query this at runtime.

In D structs and classes are distinct enough, but they currently produce duplicated templated code, this may be fixed:

void foo(T)(T o) {
    printf("foo: %d\n", o.y);
}

class A { int x = 1; }
class B : A { int y = 2; }
class C : A { int y = 3; }

void main() {
    B b = new B();
    C c = new C();
    foo(b);
    foo(c);
}

/*
DMD1:

_D4temp17__T3fooTC4temp1BZ3fooFC4temp1BZv   comdat
        push    EAX
        mov ECX,offset FLAT:_D4temp1C6__vtblZ[018h]
        push    dword ptr 0Ch[EAX]
        push    ECX
        call    near ptr _printf
        add ESP,8
        pop EAX
        ret

_D4temp17__T3fooTC4temp1CZ3fooFC4temp1CZv   comdat
        push    EAX
        mov ECX,offset FLAT:_D4temp1C6__vtblZ[018h]
        push    dword ptr 0Ch[EAX]
        push    ECX
        call    near ptr _printf
        add ESP,8
        pop EAX
        ret


LDC:

_D13testtemplates27__T3fooTC13testtemplates1BZ3fooFC13testtemplates1BZv:
    subl    $12, %esp
    movl    12(%eax), %eax
    movl    %eax, 4(%esp)
    movl    $.str3, (%esp)
    call    printf
    addl    $12, %esp
    ret

_D13testtemplates27__T3fooTC13testtemplates1CZ3fooFC13testtemplates1CZv:
    subl    $12, %esp
    movl    12(%eax), %eax
    movl    %eax, 4(%esp)
    movl    $.str3, (%esp)
    call    printf
    addl    $12, %esp
    ret
*/

Bye,
bearophile



More information about the Digitalmars-d mailing list