what is the difference between "static" function and "inline" function? [SOLVED]
-
I use the VC++ 2008 to check this question. I define one function named "max2" using keyword "static" and one function named "min2" using keyword "inline". I think that the compiler will use the code inside the min2 function to replace the function called. And the max2 with static keyword will be compiled to be a function. But after the Deassembled in Debug model. I found that the exe both use the "call " assemble code to call these two functions. why does the inline not succeed?
-
I use the VC++ 2008 to check this question. I define one function named "max2" using keyword "static" and one function named "min2" using keyword "inline". I think that the compiler will use the code inside the min2 function to replace the function called. And the max2 with static keyword will be compiled to be a function. But after the Deassembled in Debug model. I found that the exe both use the "call " assemble code to call these two functions. why does the inline not succeed?
You have the idea right, but there are several issues with
inline
. Here is a list off the top of my head: 1. You can change the setting in the Project Properties -> C/C++ -> Optimizations -> Inline Function Expansion. 2. You say you de-assembled the Debug build of your exe, but for Debug builds the default setting is Disabled. 3. Theinline
keyword does not order the compiler to expand the function inline, it is merely a request. The compiler will determine if it is worth making it inline or if it is better left as a function call. 4. If a function is marked asinline
and called from multiple other function, it might be inlined in some of the calling functions and not in others. Again the compiler determines whether it is worth it. 5. If you discover that the compiler is not inlining a function you have marked asinline
and you really, really, really want it inlined because you think you know better or you want to run profiling with it inlined and not inlined, try using the__forceinline
keyword. http://msdn.microsoft.com/en-us/library/z8y1yy88(v=vs.90).aspx[^] Soren Madsen"When you don't know what you're doing it's best to do it quickly" - Jase #DuckDynasty
-
I use the VC++ 2008 to check this question. I define one function named "max2" using keyword "static" and one function named "min2" using keyword "inline". I think that the compiler will use the code inside the min2 function to replace the function called. And the max2 with static keyword will be compiled to be a function. But after the Deassembled in Debug model. I found that the exe both use the "call " assemble code to call these two functions. why does the inline not succeed?
A static method can be inlined if the compiler decides to do so, and an inline function might be instantiated as a callable function. Its all up to the compiler. In general it can easily happen that a compiler creates both an inlined and instantiated version of the very same function (no matter if its static or inlined).
-
You have the idea right, but there are several issues with
inline
. Here is a list off the top of my head: 1. You can change the setting in the Project Properties -> C/C++ -> Optimizations -> Inline Function Expansion. 2. You say you de-assembled the Debug build of your exe, but for Debug builds the default setting is Disabled. 3. Theinline
keyword does not order the compiler to expand the function inline, it is merely a request. The compiler will determine if it is worth making it inline or if it is better left as a function call. 4. If a function is marked asinline
and called from multiple other function, it might be inlined in some of the calling functions and not in others. Again the compiler determines whether it is worth it. 5. If you discover that the compiler is not inlining a function you have marked asinline
and you really, really, really want it inlined because you think you know better or you want to run profiling with it inlined and not inlined, try using the__forceinline
keyword. http://msdn.microsoft.com/en-us/library/z8y1yy88(v=vs.90).aspx[^] Soren Madsen"When you don't know what you're doing it's best to do it quickly" - Jase #DuckDynasty