473,386 Members | 1,743 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,386 software developers and data experts.

Difference between Inline function and Ordinary function

Hi,

This is the program that i made to test the usage of inline
function. I am using vc 6.0 compiler. Please see the below program.

int NonInline( int a, int b )
{
return ( a b )? a: b;
}

inline int InLineFun( int a, int b )
{
return ( a b )? a: b;
}

int main(int argc, char* argv[])
{
int a=10,b=20;
NonInline( a,b );
InLineFun( a,b );
return 0;
}

When i compile this source code with vc6.0 compiler i can get the
following code,

; Listing generated by Microsoft (R) Optimizing Compiler Version
12.00.9044.0

TITLE D:\Personal Data\VC Studies\AssembleAnalyze\AssembleAnalyze.cpp
.386P
include listing.inc
if @Version gt 510
..model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
$$SYMBOLS SEGMENT BYTE USE32 'DEBSYM'
$$SYMBOLS ENDS
$$TYPES SEGMENT BYTE USE32 'DEBTYP'
$$TYPES ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
; COMDAT ?NonInline@@YAHHH@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ?InLineFun@@YAHHH@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _main
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif

INCLUDELIB LIBCD
INCLUDELIB OLDNAMES

PUBLIC ?NonInline@@YAHHH@Z ; NonInline
; Function compile flags: /Odt /GZ /ZI
; File D:\Personal Data\VC Studies\AssembleAnalyze\AssembleAnalyze.cpp
; COMDAT ?NonInline@@YAHHH@Z
_TEXT SEGMENT
_a$ = 8
_b$ = 12
?NonInline@@YAHHH@Z PROC NEAR ; NonInline, COMDAT

; 7 : {

push ebp
mov ebp, esp
sub esp, 68 ; 00000044H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-68]
mov ecx, 17 ; 00000011H
mov eax, -858993460 ; ccccccccH
rep stosd

; 8 : return ( a b )? a: b;

mov eax, DWORD PTR _a$[ebp]
cmp eax, DWORD PTR _b$[ebp]
jle SHORT $L546
mov ecx, DWORD PTR _a$[ebp]
mov DWORD PTR -68+[ebp], ecx
jmp SHORT $L547
$L546:
mov edx, DWORD PTR _b$[ebp]
mov DWORD PTR -68+[ebp], edx
$L547:
mov eax, DWORD PTR -68+[ebp]

; 9 : }

pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
ret 0
?NonInline@@YAHHH@Z ENDP ; NonInline
_TEXT ENDS
PUBLIC ?InLineFun@@YAHHH@Z ; InLineFun
PUBLIC _main
EXTRN __chkesp:NEAR
; Function compile flags: /Odt /GZ /ZI
; COMDAT _main
_TEXT SEGMENT
_a$ = -4
_b$ = -8
_main PROC NEAR ; COMDAT

; 17 : {

push ebp
mov ebp, esp
sub esp, 72 ; 00000048H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-72]
mov ecx, 18 ; 00000012H
mov eax, -858993460 ; ccccccccH
rep stosd

; 18 : int a=10,b=20;

mov DWORD PTR _a$[ebp], 10 ; 0000000aH
mov DWORD PTR _b$[ebp], 20 ; 00000014H

; 19 : NonInline( a,b );

mov eax, DWORD PTR _b$[ebp]
push eax
mov ecx, DWORD PTR _a$[ebp]
push ecx
call ?NonInline@@YAHHH@Z ; NonInline
add esp, 8

; 20 : InLineFun( a,b );

mov eax, DWORD PTR _b$[ebp]
push eax
mov ecx, DWORD PTR _a$[ebp]
push ecx
call ?InLineFun@@YAHHH@Z ; InLineFun
add esp, 8

; 21 : return 0;

xor eax, eax

; 22 : }

pop edi
pop esi
pop ebx
add esp, 72 ; 00000048H
cmp ebp, esp
call __chkesp
mov esp, ebp
pop ebp
ret 0
_main ENDP
; Function compile flags: /Odt /GZ /ZI
_TEXT ENDS
; COMDAT ?InLineFun@@YAHHH@Z
_TEXT SEGMENT
_a$ = 8
_b$ = 12
?InLineFun@@YAHHH@Z PROC NEAR ; InLineFun, COMDAT

; 12 : {

push ebp
mov ebp, esp
sub esp, 68 ; 00000044H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-68]
mov ecx, 17 ; 00000011H
mov eax, -858993460 ; ccccccccH
rep stosd

; 13 : return ( a b )? a: b;

mov eax, DWORD PTR _a$[ebp]
cmp eax, DWORD PTR _b$[ebp]
jle SHORT $L553
mov ecx, DWORD PTR _a$[ebp]
mov DWORD PTR -68+[ebp], ecx
jmp SHORT $L554
$L553:
mov edx, DWORD PTR _b$[ebp]
mov DWORD PTR -68+[ebp], edx
$L554:
mov eax, DWORD PTR -68+[ebp]

; 14 : }

pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
ret 0
?InLineFun@@YAHHH@Z ENDP ; InLineFun
_TEXT ENDS
END

And my doubt is there is no difference in the calling of the inline
function and the non inline function. Why is it so? Wont inline
function's code get replaced inside the calling function?

Thanks,
Amal P.

Sep 7 '06 #1
2 3827
I am sorry. I found my mistake. The problem was there is compiler
option to set. Or else you have make release build in vc6.0


Amal P wrote:
Hi,

This is the program that i made to test the usage of inline
function. I am using vc 6.0 compiler. Please see the below program.

int NonInline( int a, int b )
{
return ( a b )? a: b;
}

inline int InLineFun( int a, int b )
{
return ( a b )? a: b;
}

int main(int argc, char* argv[])
{
int a=10,b=20;
NonInline( a,b );
InLineFun( a,b );
return 0;
}

When i compile this source code with vc6.0 compiler i can get the
following code,

; Listing generated by Microsoft (R) Optimizing Compiler Version
12.00.9044.0

TITLE D:\Personal Data\VC Studies\AssembleAnalyze\AssembleAnalyze.cpp
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
$$SYMBOLS SEGMENT BYTE USE32 'DEBSYM'
$$SYMBOLS ENDS
$$TYPES SEGMENT BYTE USE32 'DEBTYP'
$$TYPES ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
; COMDAT ?NonInline@@YAHHH@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ?InLineFun@@YAHHH@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _main
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif

INCLUDELIB LIBCD
INCLUDELIB OLDNAMES

PUBLIC ?NonInline@@YAHHH@Z ; NonInline
; Function compile flags: /Odt /GZ /ZI
; File D:\Personal Data\VC Studies\AssembleAnalyze\AssembleAnalyze.cpp
; COMDAT ?NonInline@@YAHHH@Z
_TEXT SEGMENT
_a$ = 8
_b$ = 12
?NonInline@@YAHHH@Z PROC NEAR ; NonInline, COMDAT

; 7 : {

push ebp
mov ebp, esp
sub esp, 68 ; 00000044H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-68]
mov ecx, 17 ; 00000011H
mov eax, -858993460 ; ccccccccH
rep stosd

; 8 : return ( a b )? a: b;

mov eax, DWORD PTR _a$[ebp]
cmp eax, DWORD PTR _b$[ebp]
jle SHORT $L546
mov ecx, DWORD PTR _a$[ebp]
mov DWORD PTR -68+[ebp], ecx
jmp SHORT $L547
$L546:
mov edx, DWORD PTR _b$[ebp]
mov DWORD PTR -68+[ebp], edx
$L547:
mov eax, DWORD PTR -68+[ebp]

; 9 : }

pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
ret 0
?NonInline@@YAHHH@Z ENDP ; NonInline
_TEXT ENDS
PUBLIC ?InLineFun@@YAHHH@Z ; InLineFun
PUBLIC _main
EXTRN __chkesp:NEAR
; Function compile flags: /Odt /GZ /ZI
; COMDAT _main
_TEXT SEGMENT
_a$ = -4
_b$ = -8
_main PROC NEAR ; COMDAT

; 17 : {

push ebp
mov ebp, esp
sub esp, 72 ; 00000048H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-72]
mov ecx, 18 ; 00000012H
mov eax, -858993460 ; ccccccccH
rep stosd

; 18 : int a=10,b=20;

mov DWORD PTR _a$[ebp], 10 ; 0000000aH
mov DWORD PTR _b$[ebp], 20 ; 00000014H

; 19 : NonInline( a,b );

mov eax, DWORD PTR _b$[ebp]
push eax
mov ecx, DWORD PTR _a$[ebp]
push ecx
call ?NonInline@@YAHHH@Z ; NonInline
add esp, 8

; 20 : InLineFun( a,b );

mov eax, DWORD PTR _b$[ebp]
push eax
mov ecx, DWORD PTR _a$[ebp]
push ecx
call ?InLineFun@@YAHHH@Z ; InLineFun
add esp, 8

; 21 : return 0;

xor eax, eax

; 22 : }

pop edi
pop esi
pop ebx
add esp, 72 ; 00000048H
cmp ebp, esp
call __chkesp
mov esp, ebp
pop ebp
ret 0
_main ENDP
; Function compile flags: /Odt /GZ /ZI
_TEXT ENDS
; COMDAT ?InLineFun@@YAHHH@Z
_TEXT SEGMENT
_a$ = 8
_b$ = 12
?InLineFun@@YAHHH@Z PROC NEAR ; InLineFun, COMDAT

; 12 : {

push ebp
mov ebp, esp
sub esp, 68 ; 00000044H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-68]
mov ecx, 17 ; 00000011H
mov eax, -858993460 ; ccccccccH
rep stosd

; 13 : return ( a b )? a: b;

mov eax, DWORD PTR _a$[ebp]
cmp eax, DWORD PTR _b$[ebp]
jle SHORT $L553
mov ecx, DWORD PTR _a$[ebp]
mov DWORD PTR -68+[ebp], ecx
jmp SHORT $L554
$L553:
mov edx, DWORD PTR _b$[ebp]
mov DWORD PTR -68+[ebp], edx
$L554:
mov eax, DWORD PTR -68+[ebp]

; 14 : }

pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
ret 0
?InLineFun@@YAHHH@Z ENDP ; InLineFun
_TEXT ENDS
END

And my doubt is there is no difference in the calling of the inline
function and the non inline function. Why is it so? Wont inline
function's code get replaced inside the calling function?

Thanks,
Amal P.
Sep 7 '06 #2
Amal P wrote:
Hi,

This is the program that i made to test the usage of inline
function. I am using vc 6.0 compiler. Please see the below program.

int NonInline( int a, int b )
{
return ( a b )? a: b;
}

inline int InLineFun( int a, int b )
{
return ( a b )? a: b;
}
No real difference there. Since these are the only two definitions, it
doesn't
matter, but you could define InLineFun again in another Translation
Unit.
Now, "inline" is also a suggestion to the compiler that the function
call
overhead may exceed the work done in the function, but a good compiler
can figure that out anyway. All functions are visible tot he compiler.

Usually, the inline keyword is (should be) used only after profiling
shows
that the compiler misjudged the call overhead versus work done ratio.

HTH,
Michiel Salters

Sep 8 '06 #3

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

47
by: Richard Hayden | last post by:
Hi, I have the following code: /******************************** file1.c #include <iostream> extern void dummy(); inline int testfunc() {
21
by: Rubén Campos | last post by:
I haven't found any previous message related to what I'm going to ask here, but accept my anticipated excuses if I'm wrong. I want to ask about the real usefulness of the 'inline' keyword. I've...
8
by: lasek | last post by:
Hi...in some posts i've read...something about using macro rather then function...but difference ??. Best regards....
6
by: Sharon | last post by:
Usually it is common to write the class member function in the class H file, but some people like to write the function body in the C++ file. Can anybody tell me what are the cases where inline...
32
by: chris.fairles | last post by:
Just want an opinion. I have an algorithm that needs to run as fast as possible, in fact. Its already too slow. I've done as much algorithmic changes as I can to reduce the amount of code, so now...
7
by: sam_cit | last post by:
Hi Everyone, I have a function declared as inline and i was wondering as to how it would be expanded by the compiler sample(int x) { if (x>0) sample(--x); printf("%d",x); }
1
by: DumRat | last post by:
Well, the results arouse curiosity. Check out for yourselves. http://www.thescripts.com/forum/threadnav617160-2-10.html
2
by: aaragon | last post by:
Hi everyone, I would like to create a very simple function: // header file inline void point_map() { PointMap pointMap = get(vertex_point_t(), g); } // main.cpp
15
by: Mahesh | last post by:
Hi, I need to know if stack frames are generated in case of a inline function execution or do they execute just like macros? if they execute like macros, then what is the need for having inline...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.