This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: extern template and compile time


Hi again,

alright, sounds like I found my problem: I compiled my program with
-O3 which implies -finline-functions. Hence I agree gcc has to do the
instantiation to check for inlining. With -O2 it works like a charm
with a significant compilation speedup due to the extern
instantiations :)

So now, in order to make extern templates working with -O3, I tried to
add  __attribute__((noinline)) to my heavy functions members, but that
didn't do the trick.... (Also note that my member functions are not
defined at the same time they are declared.)  Maybe this could be a
gcc "bug", isn't it ?

Gael.

On Fri, Jun 13, 2008 at 7:05 PM, <g.gael@free.fr> wrote:
>
>  Hi list,
>
> Short version: I'd to know if there is a way to really avoid the
> instantiation of a template class using "extern template"
> such that the compilation time (and memory usage) get optimized.
>
> Longer version:
>
> To be more precise let's assume I have a template class Foo
> entirely declared and defined in Foo.h:
>
>  template class Foo {
>    void bar() { /* heavy code */}
>  };
>
> Let's assume the code of Foo::bar takes age to compile. So I also
> have a Foo.cpp file with a couple of explicit instantiation for the
> most common types:
>
>  template class Foo<int>;
>  template class Foo<float>;
>  template class Foo<double>;
>  // etc.
>
> Now I have to tell gcc to not instantiate Foo for these types, so I
> added the following extern template declarations at the end of Foo.h:
>
>  extern template class Foo<int>;
>  extern template class Foo<float>;
>  extern template class Foo<double>;
>  // etc.
>
> Unfortunately this does not reduce the compilation time at all (I
> mean the compilation of a single file using Foo.h, not Foo.cpp of
> course !). The only effect is that the instantiated code is not put in
> other .o object files. I also tried to replace the "extern" keyword by
> "inline" or "static" with the same result.
>
> However this works well with ICC (compilation time reduced by 3 in
> my case), and according to several documentations of extern templates
> (including C++0x spec) it seems that "extern template" should really behave
> as I expected. (well maybe the best would be to only instantiate the struct
> and inline members to still allow inlining, but that's another problem...
> BTW, that might explain the current behavior of gcc ?).
>
> So of course the workaround is to put the code of heavy members into a
> separate file, e.g. Foo.hpp, which would be included by Foo.cpp only. Though
> this works well, this is a little inconvenient because if the user uses a
> non-common type, then he has to include Foo.hpp and he lost all the
> compilation time benefits for common types (since extern still leads to an
> instantiation in memory). Again he can add his own explicit instantiations in
> a separate file but that's even more inconvenient.
>
> Hence my initial question: does there exist a better workaround ? and if not,
> is there any plan to support extern template as suggested in the C++0x spec ?
> (note that I might be wrong about the interpretation of the C++0x spec,
>  no offense !)
>
>
> Thanks a lot,
>
> Gael.
>
>
>
>
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]