인프런 커뮤니티 질문&답변

눈누님의 프로필 이미지

작성한 질문수

홍정모의 따라하며 배우는 C언어

컴파일 및 함수 관련 질문

23.02.20 11:32 작성

·

260

·

수정됨

0

안녕하세요. 컴파일 과정과 관련하여 잘 이해가 되지 않은 부분이 있어서 질문 드립니다.

 

<질문1> 컴파일 관련 질문

1) 컴파일 작업 중 전처리 단계에서는 include한 헤더파일의 내용 즉, 헤더파일에 저장된 함수 선언 부분을 소스파일로 복사붙여넣기 하는 과정이고, 헤더파일은 일반적은 함수의 선언만 되어 있기 때문에 함수가 호출될 때는 함수의 body가 있는 다른 실행파일과 연결하는 '링킹'과정이 필요하다. 라고 이해하였는데 제대로 이해하였나요?

 

즉, 전처리 단계는 함수를 선언하는 과정이라면, 함수 호출이 될 때, 함수의 body부분을 알 수 있고, 제대로 body 부분을 파악하기 위해서 '링킹'이 제대로 되는 것이 중요하다고 이해했습니다!

 

2) inline함수는 위의 일반적인 함수 호출과 달리, 주소에 접근하여 함수의 코드를 가져오는 것이 아니라 단순히 헤더파일에 있는 함수의 코드를 복사하여 main함수에 붙여넣는 구조인 것인가요? 그렇다면, 일반적인 함수 호출보다 상대적으로 더 빠르다고 볼 수 있을까요? 또한, inline함수는 함수의 주소를 모른다고 했는데, 그 이유가 무엇인지도 궁금합니다.

 


<질문2> 함수 관련 질문

함수 또한 포인터이기 때문에 함수가 호출되면, 함수가 가리키고 있는 주소에 접근하여 함수의 실행 코드를 실행한다고 하셨습니다.

 

예를 들어 sum함수를 호출한다고 할 때, a,b를 함수의 인자로 받게 되면, 변수 a,b를 통해서 접근할 수 있는 메모리에 들어있는 '값'과 함수 호출 종료 후 돌아올 주소값이 함수 실행 파일의 스택에 쌓이게 되고, 함수 실행 코드에서의 지역변수들이 그 위에 쌓이면서 스택 프레임이 생성되는 것인가요? 이러한 스택 프레임을 활용하여 code segment에 있는 함수 코드들이 실행되는 것인가요?

 

감사합니다!!!

답변 1

0

강민철님의 프로필 이미지

2023. 02. 21. 04:30

<질문1>

  1. 전처리에 대한 말씀은 맞습니다. 전처리 단계에서는 #include를 통해 소스 파일에서 헤더 파일의 내용을 복사하여 전처리된 소스 파일을 만드는 과정입니다. 다만 링킹에 대한 말씀에서 함수호출만이 링킹의 목적이라기 보다는, 컴파일러에 의해 생성된 목적 파일을 완전한 실행 파일로 만들어주기 위해 여러 목적 파일과 라이브러리를 결합하는 과정을 링킹이라고 생각하시는 것이 더 정확할 듯합니다.

  2. inline 함수는 컴파일러가 함수 호출 부분에 함수의 본문 코드를 직접 삽입하여 처리하는 것입니다. 따라서 함수 호출 부분에서 함수의 본문이 직접 실행되므로 함수 호출의 오버헤드가 줄어들게 되어 좀 더 빠를 수는 있습니다. 그리고 inline 함수는 컴파일러가 함수의 코드를 복사해서 사용하므로 함수 포인터를 사용할 수 없습니다. 따라서 inline 함수는 주소를 갖지 않습니다.

<질문2>

네 맞습니다.

함수 호출은 스택을 사용하여 구현됩니다.

함수 호출 시 인자 값과 함수의 반환 주소값이 스택에 push 되고,

함수 내에서 선언된 지역 변수와 함수 실행에 필요한 다른 데이터도 스택에 push 됩니다.

이렇게 스택에 push 된 데이터들을 모아서 하나의 스택 프레임(stack frame)을 구성하게 됩니다.

스택 프레임은 함수가 실행되는 동안에만 존재하며,

함수의 실행이 종료되면 스택 프레임이 제거됩니다.

그러니까 함수 호출이 끝나면, 스택 프레임의 메모리 공간도 같이 해제됩니다.

여담이지만 이러한 과정을 직접 관찰해보기 위해 어셈블리어를 학습해보거나 관찰해보셔도 좋습늬다.

https://godbolt.org/

가령 사이트같은 곳에서 간단한 함수를 만들어보고

스택에 값을 push하는 어셈블리어 (push)를 관찰해보셔도 좋을 것 같습니다.

눈누님의 프로필 이미지

작성한 질문수

질문하기