467,175 Members | 1,242 Online
Bytes | Developer Community
Ask Question

Home New Posts Topics Members FAQ

Post your question to a community of 467,175 developers. It's quick & easy.

are all templates inlined?

sks
All,

I thought all template instantiations were inlined until I analyzed the
following code.

template<typename t>
class Something
{
public:
inline int getSomething() { return 1; }
int getAnother();
};

template<typename t>
int Something<t>::getAnother()
{
return 2;
}

(I may not have the syntax exactly correct here since I am not
copying/pasting the code that I tested at work today).

Anyway, when I analyzed the assembly code, the compiler generated a symbol
for "getSomething" but there wasn't one for "getAnother" (it seemed to be
inlined).

Can we conclude from this that all templates are not inlined?

Thanks.
Dec 6 '05 #1
  • viewed: 975
Share:
4 Replies
sks wrote:
I thought all template instantiations were inlined until I analyzed
the following code.

template<typename t>
class Something
{
public:
inline int getSomething() { return 1; }
'inline' here is superfluous. Any member function defined in the class
definition is inline.
int getAnother();
};

template<typename t>
int Something<t>::getAnother()
{
return 2;
}

(I may not have the syntax exactly correct here since I am not
copying/pasting the code that I tested at work today).
I thin you got the right syntax.
Anyway, when I analyzed the assembly code, the compiler generated a
symbol for "getSomething" but there wasn't one for "getAnother" (it
seemed to be inlined).
That's of no consequence here.
Can we conclude from this that all templates are not inlined?


No. Whatever one particular implementation does is immaterial, really.

Besides, when compiling this particular code, the compiler could throw
everything away. The code is not _used_, so the template is never
_instantiated_.

V
Dec 6 '05 #2
sks wrote:
All,

I thought all template instantiations were inlined until I analyzed the
following code.

template<typename t>
class Something
{
public:
inline int getSomething() { return 1; }
int getAnother();
};

template<typename t>
int Something<t>::getAnother()
{
return 2;
}

(I may not have the syntax exactly correct here since I am not
copying/pasting the code that I tested at work today).

Anyway, when I analyzed the assembly code, the compiler generated a symbol
for "getSomething" but there wasn't one for "getAnother" (it seemed to be
inlined).
Template instantiation is just like anything else--they are inline when
the compiler feels like to inline them.

Can we conclude from this that all templates are not inlined?
No. You generally cannot conclude base or symbol table.

Thanks.


Ben
Dec 6 '05 #3
sks

"Victor Bazarov" <v.********@comAcast.net> wrote in message
news:7t******************************@comcast.com. ..
sks wrote:
I thought all template instantiations were inlined until I analyzed
the following code.

template<typename t>
class Something
{
public:
inline int getSomething() { return 1; }


'inline' here is superfluous. Any member function defined in the class
definition is inline.
int getAnother();
};

template<typename t>
int Something<t>::getAnother()
{
return 2;
}

(I may not have the syntax exactly correct here since I am not
copying/pasting the code that I tested at work today).


I thin you got the right syntax.
Anyway, when I analyzed the assembly code, the compiler generated a
symbol for "getSomething" but there wasn't one for "getAnother" (it
seemed to be inlined).


That's of no consequence here.
Can we conclude from this that all templates are not inlined?


No. Whatever one particular implementation does is immaterial, really.

Besides, when compiling this particular code, the compiler could throw
everything away. The code is not _used_, so the template is never
_instantiated_.

V


I do call both methods for a particular template instantiation though.
I made a mistake on my original post. One of my paragraphs should have said:
' Anyway, when I analyzed the assembly code, the compiler DID NOT GENERATE a
symbol for "getSomething" but GENERATED ONE for "getAnother" '.
So, can I conclude that templates SOMETIMES are not inlined?

If I used the above approach of separating the implementation of a member
function from the class definition, then the symbol is generated for it,
however, if the implementation of the method is defined within the class
definition, like I did above, then it seemed to be inlined.

Thanks.


Dec 6 '05 #4
sks wrote:
[...]
So, can I conclude that templates SOMETIMES are not inlined?


Sure.

V
Dec 6 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

7 posts views Thread by Senthilraja | last post: by
1 post views Thread by leo | last post: by
11 posts views Thread by Elpoca | last post: by
5 posts views Thread by Eric Fortier | last post: by
8 posts views Thread by collection60@hotmail.com | last post: by
1 post views Thread by vsgdp | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.