|
Boost : |
From: David Abrahams (dave_at_[hidden])
Date: 2007-08-10 18:42:49
on Fri Aug 10 2007, Ion Gaztañaga <igaztanaga-AT-gmail.com> wrote:
> David Abrahams wrote:
>> Imagine you have a function [template] f using named parameters. Then
>>
>> f(n = 4, s = "hello");
>>
>> and
>>
>> f(s = "hello", n = 4);
>>
>> instantiate different specializations of f at the top level even
>> though the two are functionally equivalent. Of course, everything in
>> f that generates substantial code can be in an implementation function
>> -- say, f_impl -- whose template parameters are identical for the two
>> invocations, so in the end I don't think there's much to worry
>> about. f simply gathers up and distributes references to its
>> arguments.
>
> What I really don't know is what kind of information the compiler adds
> to the executable when using meta-programming.
NOne.
> I don't kno if created types (either with recursive specialization
> or just applying metafunctions) add *some* overhead in the
> executable/library/shared library.
The creation of types involves zero runtime overhead in any C++
implementation I've seen. It's certainly possible to build a
conforming C++ compiler where there is an runtime cost for the
existence of types, but why would you?
> I'm not talking about types that have some run-time instance in the
> program but just types that are used to calculate a new type.
Yes. Even types with a run-time instance incur no runtime cost by
themselves. Only code incurs a runtime cost.
> I "guess" that all those types (which are not negligible due to
> increased compilation time) can be avoided in the executable unless
> some kind of debugging information is needed.
Yes, and that's a space cost.
> Anyway, my basic concern is that the type of the external function/class
> changes:
>
> my_class<policy_a<param_a>, policy_b<param_b> >
>
> is not the same type as
>
> my_class<policy_b<param_b>, policy_a<param_a> >
That's the precise class template analogy to my function template
example.
> That's why I still prefer a more conservative approach:
>
> my_class< policy_packer<policy_b<param_b>, policy_a<param_a> >::type >
>
> so that my_class is the same type for the same policy combination. Call
> me conservative but I still prefer seeing a definition like this:
Bleah, if you don't mind my saying so :-)
my_class<policy_b<param_b>, policy_a<param_a> >::normalized_type
would be nicer.
-- Dave Abrahams Boost Consulting http://www.boost-consulting.com The Astoria Seminar ==> http://www.astoriaseminar.com
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk