흔한 개발자의 일상

static , inline 개념과 목적 본문

개발자 공부 로그/C++

static , inline 개념과 목적

memory_captain 2020. 2. 21. 16:24

Static 메모리 할당

static 메모리는 일반 변수가 stack memory 에 담기지도 않고 Heap memory에 담기지도 않는다. 그러면 어디에 담길까?

 

Code Area에는 코드가 담기며, Global Static Area 영역에 static으로 선언된 데이터가 담긴다.

나머지 Stack , Heap 메모리 영역에 Dynamic 하게 함수 및 변수등 데이터들이 들어왔다 지워진다.

 

Static Area에 담기는 데이터의 종류

 

  • 전역변수

  • 전역함수

  • static 변수

 

Static 데이터 메모리 할당 하는 시점

: 컴파일시 메모리 할당이 되며 이 데이터가 완성된 프로그램 파일 어딘가 담겨있다.

 

static을 사용 하는 이유

: 다른 파일에서도 해당 변수 또는 함수를 호출해 데이터를 수정 및 복사해 사용하고 싶다면 static을 사용한다. 마치 전역 변수와 같이 사용할 수 있는데 이를 다른 파일에서도 호출해 사용할 수 있게 한다.

 

static의 활용 방법

  • Header 파일에 바로 선언해 사용 가능

  • class에서 static 으로 선언된 함수는 객체생성후 호출하는 방식이 아닌 콜론 두개로 호출 가능 (ex : classA::funcA())

 


inline 키워드가 존재하는 이유

 

함수를 호출하는데 시간이 2라면 그 함수가 실행되어 반환까지 이르는 시간이 0.5 일때 사실 배보다 배꼽이 더 크다고 느낄 것이다. 이를 오버헤드라고 하는데 단순히 말해 몸보다 머리가 더 커버리는 비효율을 의미한다.

경영이나 회계쪽에서도 Burden 과도 같은 의미로 사용된다는 것을 생각하면 그 의미가 분명히 전달 될 것이다.

 

현대의 컴파일러는 inline을 선언하지 않아도 자동으로  inline처리를 해준다. 대신 inline 처리를 해주지 않는 경우를 살펴보자.

 

1) If a function contains a loop. (for, while, do-while) (루프 문 존재)

2) If a function contains static variables. (static 변수 존재할 시)

3) If a function is recursive. (재귀적 함수 존재)

4) If a function return type is other than void, and the return statement doesn’t exist in function body. (리턴 타입이 무치형 외의 것일 경우)

5) If a function contains switch or goto statement. (스위치문이나 고-투 문이 있을 경우)

 

 

 inline 의 장점

 

  1. 오버헤드가 줄어든다.

  2. 오버헤드가 줄어드니 코드 최적화도 좋다.

  3. 인베디드 시스템에서 효율적이다.

 

inline의 단점

 

  1. 코드량이 많아지면서 파일도 커진다.

  2. Too much inlining can also reduce your instruction cache hit rate, thus reducing the speed of instruction fetch from that of cache memory to that of primary memory. (캐시메모리 적중률이 떨어지면서 메모리에서 데이터를 가져오는 속도도 느려짐)

  3. 인베디드에서 쓸수는 있겠지만 그쪽 환경에서는 속도보다는 코드양에 더 신경을 쓴다.

 

## 캐시 메모리 적중률이란?

캐시 메모리에 데이터를 찾을때 저장소에 존재할 경우를 확률로 나타낸 것이다. 

평균 97%의 확률로 존재한다. 만일 데이터를 찾지 못할 경우 찾을때 까지 Circle을 돌기에 속도가 느려지게 되는 이유다.