함수와 메모리 할당
함수는 메모리에 할당되어 있다.
함수 호출 시의 일련의 과정
- 변수들을 스택에 push.
- 함수 주소로 점프.
- 함수를 실행.
- 호출자 함수로 다시 점프.
- 1번에서 넣어준 변수들을 pop.
CPU 캐시 최적화의 한계
- 현재 실행 중인 함수가 호출한 함수의 메모리가 물리적으로 멀리 있을 수 있다.
- 최근에 읽은 메모리는 CPU 캐싱되어 빠르게 읽을 수 있지만, 멀리 있는 것은 실제 메모리에 접근한 뒤 캐싱을 하여 읽어오기 때문에 느릴 수 있다.
함수화의 잘못된 극단적인 주장
- "모든 걸 함수로 만들어라"라는 주장은 잘못된 것이다.
- 코드가 길어져 가독성을 높이기 위해 함수를 만드는 것은 재활용 가능성이 있을 때에만 적합하다.
인라인 함수
인라인 함수는 함수 호출 대신 복사/붙여넣기를 수행한다.
Cat *myCat = new Cat(2, "Coco");
int age = myCat->getAge();
위 코드는 컴파일 시에 int age = myCat->age;
으로 변환되어 실행된다.
매크로와 인라인 함수의 차이
- 매크로는 전처리기가 복사 붙여넣기를 하며, 디버깅이 어렵다.
- 매크로는 범위를 준수하지 않는다.
결론
매크로를 사용해야하는 이유가 없다면 인라인 함수를 사용해야 한다.
인라인 함수 주의점
- inline 키워드는 힌트일 뿐이며, 컴파일러가 인라인을 적용할지 여부를 결정한다.
- 인라인을 명시한 함수가 인라인이 될 수도 있고 아닐 수도 있다.
- 인라인을 명시한 함수가 아니더라도 컴파일러의 재량으로 인라인을 적용할 수 있다.
- 인라인 함수 구현은 헤더 파일에 위치해야 한다.
- 복사/붙여넣기를 하려면 컴파일러가 그 구현체를 볼 수 있어야 하기 때문이다.
- 간단한 함수에 적합하며, 실행 파일의 크기가 증가할 수 있다.
- 함수가 위치한 부분을 복사 붙여넣기 하기 때문에 실행 파일의 크기가 커질 수 있다.
- CPU는 실행 파일의 크기가 작을 수록 캐싱이 빨라 효율이 상승한다.
'Language > C++' 카테고리의 다른 글
[C++] 31.Unmanaged Programming: Exception (1) | 2024.01.31 |
---|---|
[C++] 30.Unmanaged Programming: static 키워드 (1) | 2024.01.31 |
[C++] 28.Unmanaged Programming: dynamic_cast (1) | 2024.01.30 |
[C++] 27.Unmanaged Programming: const_cast (1) | 2024.01.30 |
[C++] 26.Unmanaged Programming: reinterpret_cast (0) | 2024.01.30 |