C++ in Constrained Environments - Bjarne Stroustrup - CppCon 2022

직접 정리한 내용

하나의 도구, 한 라이브러리, 하나의 언어가 모든것을 해결한다고 기대하지 마라.

저코드 수준, 복잡성, 에러를 다뤄야 한다. 최소한 C++11버전을, 되도록 20을 권장한다.

실수를 배워야 해결책을 이해하기 때문이라 하지만, 이제 C++에는 C에 없는 기능이 많다.

임베디드 시스템에서도 예외를 꼭 피해야 할 필요는 없다.

C++의 최신기능을 극단적으로 추구하는 것은 좋지 않다.

설계는 단순하고, 안전하며, 일반적인 인터페이스를 제공해야한다. 필요하면 나중에 개선하고 최적화해라.

산술연산을 시프트로 바꾸는 등의 미세 최적화에 집착하지마라. 병목이 어디인지 집중해라.

C++는 하드웨어 직접매핑과 제로 오버헤드 추상화 두가지 기둥위에 있다. 1. 제로오버헤드 추상화는 추상화를 쓰면서도 그 비용을 감당할 수 있어야 한다는 뜻이다. 그 기본은 정적타입 시스템, 기본형과 사용자 정의형에 대한 동등한 지원, 값과 참조 의미론이다. 2. C/C++는 메모리 모델이 단순하기에 성공했다. 메모리는 객체의 연속이고 포인터/참조는 기계주소에 타입정보를 붙인게 끝이다. 이 단순성이 핵심이다. (복잡한 수학적 모델같은 걸 끼워넣지 않는다)

데이터 레이아웃을 압축적으로 만들면 간접참조를 줄이고 성능을 높일 수 있다. 하지만 상호작용이 많아지면 문제가 된다.

하드웨어를 다루는 시스템에서 캐시, NUMA, 메모리 계층 등 실제 기계모델을 이해해야 한다. C++기계 모델은 유용하고 추상화지만, 고성능/임베디드 시스템에서는 이를 무시하면 안된다. 그럼에도 의도를 코드에 녹여내야 한다.

높고 깨끗한 레벨에서 시작하되, 가능한 컴파일타임이나 런타임에서 검사할 수 있게 해라. variant는 union과 달리 의도를 품고 있다. 일반적으로 더 명확한 표기법은 존재하고, 약간의 오버헤드를 대가로 안전성이 올라간다. 대부분의 경우 완전한 무오차(zero-cost abstraction) 는 어렵다. 의도를 더 많이 요구하면 비용을 지불해야 한다.

저수준 코드를 잘 다지고, 초기화를 확실히하며, 깔끔한 인터페이스를 만들어 추상화 수준을 올려라. 이때 클래스, 템플릿, 컴파일 타임 계산등의 C++기능들로 오버헤드를 만들지 않고 추상화를 제공할 수 있다.

제로 오버헤드원칙 : 사용하지않으면 비용이 없다. 그러나 더 많은 것을 요구하면 그에 따른 비용이 발생한다.

사용자 정의 타입은 C++기반으로, 좌표, 복소수, 색상같은 작은 타입 정의로 가독성과 정적검사가 좋아진다.임베디드 시스템에서 데니스리치(C)가 만든 내장 타입이 더 빠르다고 믿는데, 직접 만든 타입도 충분히 간결하고 효율적일 수 있다.

자원관리는 RAII를 활용해라. close나 delete가 있으면 20년전의 뷰를 보는 것 같다.

(벡터역시 전형적인 RAII.)

컴파일 타임으로 옮길수있다면 옮겨라. 인라인함수, constexpr, 템플릿 메타프로그래밍을 이용해라. 정적 분석으로 오류를 잡아 복잡한 에러 핸들러를 줄이면 좋다. (ex 정수 제곱근 계산은 컴파일타임에 계산해 상수로 넣는게 좋음.)