On December 6, 2017 6:38:11 PM GMT+01:00, Martin Sebor <mse...@gmail.com> wrote:
>While testing a libstdc++ patch that relies on inlining to
>expose a GCC limitation I noticed that the same member function
>of a class template is inlined into one function in the test but
>not into the other, even though it is inlined into each if each
>is compiled separately (i.e., in a file on its own).
>
>I wasn't aware that inlining decisions made in one function could
>affect those in another, or in the whole file.  Is that expected?
>And if yes, what's the rationale?
>
>Here's a simplified test case.  When compiled with -O2 or -O3
>and either just -DFOO or just -DBAR, the call to vector::resize()
>and all the functions called from it, including (crucially)
>vector::_M_default_append, are inlined.  But when compiled with
>-DFOO -DBAR _M_default_append is not inlined.  With a somewhat
>more involved test case I've also seen the first call inlined
>but not the second, which was also surprising to me.

There are unit and function growth limits that can be hit. 

>   #include <vector>
>
>   void sink (std::vector<int>&);
>
>   #if FOO
>   void foo (unsigned n)
>   {
>     std::vector<int> a;
>     a.resize (n);
>     sink (a);
>   }
>   #endif
>
>   #if BAR
>   void bar (unsigned long n)
>   {
>     std::vector<int> a;
>     a.resize (n);
>     sink (a);
>   }
>   #endif
>
>Thanks
>Martin

Reply via email to