본문 바로가기

임베디드 프로그래밍

[임베디드] C++ 가상함수의 inline화, Devirtualization - Don 임베디드

임베디드 환경에서 C를 많이 사용한다는 것은 두 말하면 입 아픈 소리이다.

C++는 C 보다는 무겁지만,

객체지향 개념을 지원하기 때문에 방대한 양의 코드를 관리하기 편리한 이점이 있다.

게다가 기존의 코드들은 거의 C로 짜여 있기 때문에,

C의 문법을 그대로 사용할 수 있다는 점이 큰 메리트이다.

그렇기에 임베디드 환경에서도 C++를 사용하는 곳이 많아졌다.

 

그런데 문제는, C++에서 지원하는 몇몇 기능이

코드 관리 측면에서는 효율적이나,

성능 측면에서 사용하기 부담스러운 요소가 있다.

많은 경우에 성능은 코드 구조를 해쳐가면서라도(ㅠㅠ)

달성해야 하는 제 1목표이기 때문이다.

 

그 부담스러운 요소 중 하나가 바로

가상화 or 가상 함수(virtualization)로 인한

virtual table searching에 드는 시간이다.

요즘에는 컴파일러의 기능이 좋아져서 웬만한 최적화는 다 해주지만,

그럼에도 불구하고 virtual class/ virtual function을 사용하게 되면

함수를 호출할 때마다 virtual function table을 접근할 수밖에 없는

상황이 발생한다.

 

이를 피하기 위해선 어떻게 해야할까?

세 가지 방법이 떠오른다. 

1. 깔끔하게 virtual function을 포기하는 방법이 있다!

2. 조금 타협해서, 성능에 critical 한 class들에는 virtual function을 사용하지 않는다.

3. virtual function을 "Devirtualize" 시킨다.

 

1, 2번 방법은 처음부터 구조를 짜는 경우 가능하겠다.

하지만 이미 virtual function을 사용한 구조로 설계를 해 두었고,

구조를 전면 수정하기엔 너무 막막한 경우 3의 방법을 사용할 수 있겠다.

 

다음은 3번 방법에 대해서 자세하게 설명한 글이다.

https://kaushikghose.wordpress.com/2017/11/20/inline-virtual-final/

 

Inline virtual final

I was looking into virtual functions (that link is the most succinct exposition I have seen) for some of my code. And I began to think, huh, won’t this slow things down? The code first has to…

kaushikghose.wordpress.com

요약하자면, C++11부터 지원하는

final 키워드를 사용하는 것이다.

이 방법의 핵심은,

컴파일러가 compile time에 결정할 수 있도록 돕는 것이다.

해당 함수 호출이 무엇을 가리키는지에 대한 판단을

run time이 아닌 compile time에 할 수 있도록 final 키워드를 통해 명시해 준다.