CPP_어소_18_재귀함수(1)

CJB_ny·2022년 5월 7일
0

CPP_AROTHO

목록 보기
16/83
post-thumbnail
post-custom-banner

호출스택, 조사식 파악!


호출스택

이거 잘 파악 해야한다!

스택메모리 영역 다시 보자면

마지막에 호출이 된게 종료가 되고

main이 제일 마지막임!

FILO

그러면 호출스택이 뭔지 보면은

지금 호출되고있는 메모리 상황을 보여주고있는 것이다.

여따 디버그 잡고 호출스택 보면

20번째 줄이 호출되기 직전이라

이렇게 main함수 보이나?

로컬에는 main함수만 호출되고 나서의 현재 지역을 보여주고있다.

F11로 두번 실행하면

지금 Factorial함수 들어와서 호출 스택에

이렇게 쌓임!! FILO!!

상황보기

호출스택 따블클릭 하면 로컬에 해당 호출스택의 함수? 로컬 보여준다.

프로그래밍에 절대는 없다.

디버그로 값을 눈으로 직접 확인해야한다.

값전달

그러면 시팔 함수 종료되면 스택에서 메모리 값이 날라가는데

전달해주고 스택에서 메모리 없애나 아니면

스택 없애고 전달? 이건 말이 안됨.

사실 CPU에 레지스터 메모리(연산할 때 빠르게 접근 할 수있는 메모리)

return할 값을 레지스터 메모리에 잠시 받아놓는다.

그다음 스택에서 팩토리얼 함수 없애고 main에서 받아온다.

메모리는

여기에서 얘기(쳐놓은) 코드들에 따라서

결과가 발생하는 곳이 메모리이다.

Factorial 함수를 다시 안에서 호출했다는 것은

이렇게 새로운 스택이 쌓인것이다.

재귀함수 사용?

  • 가독성

  • 구현에 용이

라는 장점이 있는데..

성능이 안좋음

스택메모리 영역에 쌓아가면서

각각의 스택에 남아있는 데이터들을 역으로 되돌아 나오면서 재활용 하는 식이다.

각각의 스택에 남아있는 데이터들을 역으로 되돌아 나오면서 재활용 하는 식이다.

이거 무슨말??

스택에 있는 함수들을 마치 변수처럼 활용을 하는거라

==(하나의 함수에서 변수를 여러개를 선언해서 해결할 것을)

여러번 함수를 호출해서 각각의 스택에 남아있는 값들을 현재 지역변수들 처럼 활용을 하는 개념이라서

함수 호출 비용과 해제비용까지 들어간다.

성능 안좋은 이유 정리

하나의 함수만 호출을 해서 20byte잡아먹어서 Factorial구현했다고 하자.

그런데

재귀를 쓰면 3byte짜리 함수를 스택에 계속 막 쌓으면서 호출을 하다보니까

스택에 쌓인 메모리가 40~50byte가 되었다.

그래서 성능 안좋음

함수 호출비용 해제비용

편리하지만

유의해서 사용해야된다.

profile
https://cjbworld.tistory.com/ <- 이사중
post-custom-banner

0개의 댓글