On Thursday, 1 August 2013 at 21:17:34 UTC, H. S. Teoh wrote:
On Thu, Aug 01, 2013 at 10:06:54PM +0200, JS wrote:
[...]
Now are you telling me that

template A()
{
    void foo() { writeln("asdf"); }
}
void main()
{
        A!().foo();
}

does not create a function foo in the binary? That it is equivalent
to just calling writeln("asdf"); directly? (exact same code)
[...]

I said that every instantiation of a template creates a copy of
everything inside. Therefore, A!().foo() will create a copy of A.foo()
in the binary.

The template itself has no binary representation, in the sense that if
you write:

        template A(int x) {
                void foo() { writeln(x); }
        }

there is nothing in the binary corresponding with the template A, or the uninstantiated function foo. But if you instantiate A with some value of x, then you will get a copy of A.foo for every value of x that you
instantiate the template with. So if you write:

        A!1.foo();
        A!2.foo();
        A!3.foo();

Then you will get 3 copies of foo() in your executable, one for each
value of x.



yes, I understand that... now use a template for a string mixin!!!!!

template A()
{
    string A() { ... }
}

...

mixin(A());

IS A GOING TO BE IN THE BINARY?!?!?! Yes, I'm yelling... just to get the point across about the question I'm trying to get answered.

the function A is never used at runtime SO it should technically not be in the binary UNLESS dmd treats it as a normal template function then it will(but shouldn't)!

e.g.,

if the compiler smart enough to realize that A(); is different from mixin(A());

(one being compile time and the other not)


Reply via email to