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: C++: pointer to member as template argument and inline


It seems the answer to my question is "no" :-(

With GCC 4.0.2 (using -O3) the call to 'inc' does not get inlined in
following code:

struct S
{
 int inc(int v)
 {
   return v+1;
 }

 template<int (S::*f)(int)> int call(int v)
 {
   return (this->*f)(v);
 }

 int func(int v)
 {
   return call<&S::inc>(v);
 }
};

int main()
{
 S s;

 return s.func(6);
}



This is kind of surprising since in this next example the call to
'inc' does get inlined:

int inc(int v)
{
 return v+1;
}

template<int (*f)(int)> int call(int v)
{
 return (*f)(v);
}

int func(int v)
{
 return call<&inc>(v);
}

int main()
{
 return func(6);
}


Why does GCC optimizer discriminate between these two scenarios so drasticly? I wonder if this is intensionally...


On 8/6/06, Kristian Spangsege <kristian.spangsege@gmail.com> wrote:
Hi,

Is GCC able to inline a method when that method is passed as a
pointer-to-member template argument and then called with the syntax
(this->*foo)(...) ?



--
"Will robots inherit the earth? Yes, but they will be our children. We
owe our minds to the deaths and lives of all the creatures that were
ever engaged in the struggle called Evolution. Our job is to see that
all this work shall not end up in meaningless waste."
                                             -- MARVIN L. MINSKY


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