임베디드 환경에서 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/
요약하자면, C++11부터 지원하는
final 키워드를 사용하는 것이다.
이 방법의 핵심은,
컴파일러가 compile time에 결정할 수 있도록 돕는 것이다.
해당 함수 호출이 무엇을 가리키는지에 대한 판단을
run time이 아닌 compile time에 할 수 있도록 final 키워드를 통해 명시해 준다.