C++ Function

iron·2022년 3월 29일
0

cpp-study

목록 보기
1/1
post-thumbnail

Daily study code

#include <iostream>

int multiplyBy(int x, int y)
{
	int result = x * y;
	return result
}

int main()
{
	int x = 3;
    int y = 5;
	int result = multiplyBy(x, y);
    std::cout<< result << std::endl;
	return 0;
}

스택 프레임

WINDOWS, MAC, Linux와 같은 운영체제(OS)가 프로그램을 실행할 때 code area, stack area, heap area 등과 같은 메모리 공간을 할당해 준다.
Stack 이라는 영역은 함수에서 사용하는 메모리 영역이고, 함수 호출할때마다 일련의 함수 정보들을 스택에 쌓는데 이를 스택 프레임이라고 한다.
스택 라이프 사이클

  1. 높은 주소에서 낮은 주소로 진행된다.
  2. 함수의 매개 변수를 가장 먼저 push 한다.
  3. 함수 종료후 수행되어야 할 주소 값을 push 한다.
  4. 함수 코드를 수행하면서 필요한 값들을 스택에서 활용

주요 어셈 코드 (32bit)

함수 호출 어셈코드
함수를 호출하기전에 매개변수 y, x 와 이후에 실행 될 반환 주소 값을 push 하는 모습이 보인다.
스택 포인터 메모리 주소 현황
함수가 호출되는 어셈 코드가 시작된 후 메모리 상태이며 주소의 값에 매개변수 값 3과 5가 저장되어 있고, 다음으로 함수 호출이 끝난 후 진행되어야 할 코드의 주소 값이 정상적으로 입력되는 것을 볼 수 있다.

스택 선작업
함수 작업을 수행하기 위한 선작업을 진행하는데, 3번째 라인 sub esp, 0C0h 구문이 함수의 스택 영역을 지정한다.
p.s 즉 OS에서 부여한 스택 영역이 부족하게 된다면 stack overflow 간드아...

result 지역변수 리턴 어셈코드
eax(누산기 레지스터)에 x값을 대입하고, eax 값과 y의 값을 곱셈한다. 곱셈 결과는 eax에 저장되는데, 해당 결과를 result 지역 변수에 값을 대입하고 리턴 구문에서 eax 레지스터에 또 지역 변수의 값을 대입하는 것이 보인다.

지역변수 result에 eax값을 대입하고 eax에 다시 result 값을 대입하는 부분이 불필요 해보여서 x * y 결과값을 바로 리턴해보았다.

result 지역변수 미사용 리턴 어셈코드
어셈 코드가 한줄 줄어든 것을 볼 수 있었다. 미세 최적화라고 볼 수 있겠지만, 경험상 디버깅을 위해서, 가독성을 위해서 지역변수를 활용하는게 더 좋을것 같다.

profile
iron

0개의 댓글

관련 채용 정보