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 |