C와 달리 C++은 함수 오버로딩을 지원한다. 


함수 오버로딩은 함수 인자를 통해 동일한 이름의 함수를 구분하게 해준다.

함수 리턴 타입으로는 오버로딩이 되지 않는데, 함수를 부를 때 리턴값으로는 구분이 되지 않기 때문이다.


오버로딩 코드의 어셈블러 코드를 보면, 오버로딩은 결국 인자에 따라 컴파일러가 다른 이름의 함수를 여럿 생성하는 것이다.


예시 코드



아래는 어셈블리 코드이다.

보면 foo(int)는 fooi로, foo(double)은 food로 생성한 것이다. 

그리고 각각 아래에서 호출하고 있는 것이 보인다.


.file "practice.cpp"

.text

.globl _Z3fooi

.def _Z3fooi; .scl 2; .type 32; .endef

.seh_proc _Z3fooi

_Z3fooi:

.LFB0:

pushq %rbp

.seh_pushreg %rbp

movq %rsp, %rbp

.seh_setframe %rbp, 0

.seh_endprologue

movl %ecx, 16(%rbp)

movl $0, %eax

popq %rbp

ret

.seh_endproc

.globl _Z3food

.def _Z3food; .scl 2; .type 32; .endef

.seh_proc _Z3food

_Z3food:

.LFB1:

pushq %rbp

.seh_pushreg %rbp

movq %rsp, %rbp

.seh_setframe %rbp, 0

.seh_endprologue

movsd %xmm0, 16(%rbp)

movl $0, %eax

popq %rbp

ret

.seh_endproc

.def __main; .scl 2; .type 32; .endef

.globl main

.def main; .scl 2; .type 32; .endef

.seh_proc main

main:

.LFB2:

pushq %rbp

.seh_pushreg %rbp

movq %rsp, %rbp

.seh_setframe %rbp, 0

subq $32, %rsp

.seh_stackalloc 32

.seh_endprologue

call __main

movl $1, %ecx

call _Z3fooi

movq .LC0(%rip), %rax

movq %rax, %xmm0

call _Z3food

movl $0, %eax

addq $32, %rsp

popq %rbp

ret

.seh_endproc

.section .rdata,"dr"

.align 8

.LC0:

.long -1717986918

.long 1072798105

.ident "GCC: (GNU) 7.1.0"



'프로그래밍 > C++' 카테고리의 다른 글

함수를 못 쓰게 하기  (0) 2017.10.08
인라인 함수  (0) 2017.10.08
디폴트 파라미터  (0) 2017.10.08
printf 형식지정자  (0) 2017.10.03
표준 입력 cin  (0) 2017.08.06

+ Recent posts