are mixin string templates with functions removed?

JS js.mdnq at gmail.com
Thu Aug 1 13:06:54 PDT 2013


On Thursday, 1 August 2013 at 18:09:54 UTC, H. S. Teoh wrote:
> On Thu, Aug 01, 2013 at 07:52:28PM +0200, JS wrote:
>> On Thursday, 1 August 2013 at 17:47:00 UTC, H. S. Teoh wrote:
>> >On Thu, Aug 01, 2013 at 07:12:51PM +0200, John Colvin wrote:
>> >>On Thursday, 1 August 2013 at 17:09:07 UTC, JS wrote:
>> >>>If I have a bunch of templates that are only used for code
>> >>>generation, are they removed in the binary(since they are 
>> >>>not
>> >>>needed)?
>> >>
>> >>templates don't exist in binaries.
>> >
>> >Templates are like cookie molds, you use them to generate 
>> >lots of
>> >(almost) identical cookies, but you never serve the mold to 
>> >the
>> >customer. ;-)
>> >
>> >
>> >T
>> 
>> But what about the functions that exist in them?
>
> Like I said, cookie molds. You use the mold to press cookies, 
> but only
> the cookies are served, not the mold. The mold may be very 
> complicated,
> containing subcookies attached to bigger cookies, but whatever 
> is
> pressed (i.e., instantiated) is what's served on the dinner 
> plate. The
> mold always remains in the kitchen.
>
>
>> template A()
>> {
>>     void A()
>>     {
>>         B();
>>     }
>>     void B() { }
>> }
>> 
>> is everything in the template removed 100% or is there junk 
>> that the
>> compiler doesn't remove?
>
> There is nothing to remove. If you instantiated the template, 
> then you
> get a copy of everything in it. The number of copies equals the 
> number
> of distinct instantiations. The template itself is just a mold, 
> an
> abstract entity that doesn't exist in binary form. What it does 
> is to
> serve as a mold (hence, "template") to make code. So if you use 
> to make
> 10 copies of the code, that's what you'll get in your 
> executable. If
> your template contains 5 functions, then each instantiation 
> produces 5
> copies of those functions. Simple as that.
>
> Of course, not all code produces binary data -- enum and alias
> definitions don't produce any binary code, for example -- 
> they're just
> logical entities that only exist at compile time. So if you 
> have an enum
> inside a template, it will get copied however many times you 
> instantiate
> the template, but none of those copies end up in the executable 
> because
> they're just declarations, not actual code or data.
>

Ok, I'm not talking about the template itself but what is 
contained in the template. It is obvious that templates can 
"insert" stuff into the binary.

a mixin template can easily do that.


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)

e.g., it is the same as

void main() { A!().foo(); }

cause when I actually debug I see a function call to foo.

So, saying that templates are like cookie cutter doesn't prove 
anything.

If I have

void main() { }

the binary file is is 150kB. If I add import std.stdio; It jumps 
to 300kB.

So the linker and compiler are not removing all untouched code.




More information about the Digitalmars-d-learn mailing list