Sunday, 15 March 2015

c++ - Function template instantiations not exported to other compilation units, if inlined? -



c++ - Function template instantiations not exported to other compilation units, if inlined? -

i'm observing peculiar phenomenon in g++ not export template function instantiations if they're used inlined.. not true regular non-templated functions, of course. example:

// main.cpp #include <iostream> #include "inc.h" int main() { std::cout << func<3>() << std::endl; std::cout << func2() << std::endl; homecoming 0; } // inc.h template<int num> int func(); int func2(); // a.cpp template<int num> int func() { homecoming num; } int func2() { homecoming 5; } int result; int result2; void instantiate() { // store results in globally visible variables // compiler won't optimize them out result = func<3>(); result2 = func2(); }

if compile above -o0, linking successful - objdump confirms binary code both func2 , func<3> generated in a.o , instantiate making 2 function calls, ie functions not beingness inlined.

however, -o3 changes things - instantiate contains no function calls , func<3> not generated in assembly, causing linker error. func2 still there, of course.

i bitten in real code, expecting functions exported , getting linker errors. behavior expected? compiler convinced generate functions if they're used inline in compilation unit they're implemented in? in case have many template specializations.. explicit instantiation impractical.

c++ templates

No comments:

Post a Comment