<div dir="ltr"><div>Hi,</div><div><br></div><div>> <span style="font-size:13px">BTW: is there any other trick to force instantiation, without generating any text?</span></div><div><span style="font-size:13px"><br></span></div><div><span style="font-size:13px">I guess the main C++11 trick for this is to use "extern templates". I've used extern templates quite a bit to cut down on compilation times (and memory usage) of template-heavy code, but its impact is limited by the fact that building the AST (within the instantiation) is still a pretty big deal. For example, I had some code that needed about 6GB and lots of time to compile (with GCC), and by putting some of the main template instantiations into a separate cpp file, I would end up with about 4GB to compile each of the two separate cpp files, in other words, 6GB turned into 4GB + 4GB, roughly, and about the same for compilation time, meaning that this was a net loss in overall compilation costs, but with benefits like actually being able to compile it (without overwhelming the system) and reducing the need for recompilations (e.g., recompiling only one of the cpp files, instead of everything). BTW, with Clang, this is significantly faster to compile compared to GCC (1/2 of the time, and 1/3 of the memory, approximately).</span></div><div><span style="font-size:13px"><br></span></div><div><span style="font-size:13px">But the point is that it seems to me (I might be wrong) that even with an existing instantiation (extern or not), the compilation time/memory needed to deal with it is still significant.</span></div><div><span style="font-size:13px"><br></span></div><div><span style="font-size:13px">I have one related question to the clang devs: </span></div><div><span style="font-size:13px">When you have an extern template declaration in a header file that is part of a module, is the complete AST (or whatever else) of that template instantiation included in the module?</span></div><div><br></div>> <span style="font-size:13px">In principle, we could extend the modules system with a template</span><br style="font-size:13px"><span style="font-size:13px">> instantiation repository to cache the results of instantiating</span><br style="font-size:13px"><span style="font-size:13px">> </span><span style="font-size:13px">templates from modules, but I don't think anyone is working on, or</span><br style="font-size:13px"><span style="font-size:13px">> </span><span style="font-size:13px">planning, such a system for Clang at the moment.</span><br><div class="gmail_extra"><div class="gmail_signature"><br></div><div class="gmail_signature">That sounds to me like automatically making all template instantiations "extern", right? This could actually be pretty awesome. But I'm worried about the implications for the standard rules (it looks to me like it could be allowed). That could be part of the rules for modules, that any instantiation encountered for a template declared/defined inside a module would implicitly be considered "extern" and cached somewhere alongside the module's cache.</div><div class="gmail_signature"><br></div><div class="gmail_signature">> <span style="font-size:13px">from my experience, it was rather the template instantiation that was causing long build times and not the preprocessing. </span></div><div class="gmail_signature"><span style="font-size:13px"><br></span></div><div class="gmail_signature"><span style="font-size:13px">That's right. Last time I ran my code through GCC with compilation profiling enabled, it showed that template instantiations accounted for about 98% of the compilation time. For template-heavy code, pre-processing, parsing, AST building and all the "normal" compilation stuff is negligible. And for code that isn't template-heavy, compilation times are rarely a big problem.</span></div><div class="gmail_signature"><span style="font-size:13px"><br></span></div><div class="gmail_signature"><span style="font-size:13px">Cheers,</span></div><div class="gmail_signature"><span style="font-size:13px">Mikael.</span></div><div class="gmail_signature"><span style="font-size:13px"><br></span></div>
</div></div>