본문으로 건너뛰기
Embedded C++ for Real Systems · 0/41

Embedded C++ for Real Systems — 임베디드 모던 C++ 시리즈 소개

· Hawk · 6분 읽기

#이 시리즈를 쓰는 이유

“임베디드에서 C++를 쓰면 안 됩니다.”

이런 말을 들어본 적 있으신가요? 아직도 많은 임베디드 팀에서는 C++를 금기시합니다. 이유는 대략 이렇습니다:

  • “C++는 무겁다”
  • “예외 처리가 예측 불가능하다”
  • “동적 할당이 위험하다”
  • “런타임 오버헤드가 있다”

일부는 맞고, 일부는 틀립니다.

Modern C++의 많은 기능은 zero-cost abstraction입니다. 컴파일 타임에 모든 것이 결정되고, 런타임 오버헤드는 없습니다. 이 시리즈는 임베디드에서 C++를 안전하고 효율적으로 사용하는 방법을 다룹니다.

#대상 독자

  1. C에서 C++로 전환하려는 임베디드 개발자

    • “C++를 써도 될까?” 고민 중인 분
    • 팀에 C++ 도입을 설득해야 하는 분
  2. C++를 쓰고 있지만 확신이 없는 분

    • “이렇게 해도 되나?” 싶은 코드가 있는 분
    • Best practice를 알고 싶은 분
  3. Modern C++ 기능을 임베디드에 적용하고 싶은 분

    • C++11/14/17/20/23 기능 중 뭘 써도 되는지
    • 어떤 기능은 피해야 하는지

#시리즈 구성

총 5개 Part, 40개 글로 구성됩니다.

C++ 기초부터 zero-cost abstraction, 메모리 관리, 고급 패턴, 하드웨어 추상화까지 체계적으로 다룹니다.


#Part 1: C++ in Embedded Context (8개)

임베디드에서 C++를 사용하는 기본 원칙을 다룹니다.

#글 제목핵심 내용
1-01C++ vs C: 무엇이 다른가오버헤드 분석, 장단점
1-02컴파일러 플래그 가이드-fno-exceptions, -fno-rtti, -Os
1-03런타임 요구사항libstdc++, newlib, 최소 런타임
1-04코드 크기 분석bloat 원인, 측정 방법
1-05ABI 호환성C/C++ 혼합, name mangling
1-06스타트업 코드static 생성자, __libc_init_array
1-07링커 스크립트와 C++.init_array, 섹션 배치
1-08C++ 표준 선택C++11/14/17/20/23 비교

#Part 2: Zero-Cost Abstractions (10개)

런타임 비용 없이 추상화하는 방법을 다룹니다.

#글 제목핵심 내용
2-01RAII 기초리소스 관리, 소멸자 보장
2-02RAII 실전 패턴Lock, Handle, ScopedXxx
2-03constexpr 기초컴파일 타임 계산
2-04constexpr 고급LUT 생성, CRC 테이블
2-05consteval과 constinitC++20 기능
2-06Templates 기초함수/클래스 템플릿
2-07Templates 비용 분석코드 bloat 측정, 제어
2-08Static PolymorphismCRTP, virtual 없이 다형성
2-09Type Traits 활용std::is_*, SFINAE
2-10Concepts (C++20)템플릿 제약, 가독성

#Part 3: Memory & Error Handling (10개)

메모리와 에러를 안전하게 다루는 방법을 다룹니다.

#글 제목핵심 내용
3-01동적 할당 없이 C++ 쓰기std::array, static 할당
3-02Custom Allocator 기초Allocator 인터페이스
3-03Pool Allocator 구현고정 크기 블록
3-04std::pmr 활용polymorphic_allocator
3-05No-Exception 설계-fno-exceptions 환경
3-06에러 처리 패턴error code, optional
3-07std::expected (C++23)Result 타입
3-08No-RTTI 설계typeid 없이 타입 정보
3-09스마트 포인터 선택unique_ptr vs shared_ptr
3-10소유권 모델Ownership, borrowing

#Part 4: Advanced Patterns (8개)

고급 C++ 패턴을 임베디드에 적용합니다.

#글 제목핵심 내용
4-01Intrusive Containers동적 할당 없는 자료구조
4-02ETL 라이브러리Embedded Template Library
4-03Lock-free 기초atomic, CAS
4-04Lock-free Containerqueue, stack
4-05Type-safe Flagsenum class, 비트 플래그
4-06State Machine타입 안전한 상태 머신
4-07Compile-time FSMconstexpr 상태 머신
4-08Singleton 대안의존성 주입, static

#Part 5: Hardware Abstraction (4개)

C++로 하드웨어를 추상화하는 방법을 다룹니다.

#글 제목핵심 내용
5-01Register 추상화타입 안전한 MMIO
5-02GPIO 추상화템플릿 기반 GPIO
5-03Peripheral 추상화UART, SPI, I2C
5-04HAL 설계 패턴범용 HAL 구조

#학습 로드맵

  • C++ 도입 검토 중 — Part 1 (기초) → Part 2-01~04 (RAII, constexpr)
  • 이미 C++ 사용 중 — Part 2 (zero-cost) → Part 3 (메모리/에러) → Part 4 (패턴)
  • 하드웨어 추상화 설계 — Part 2-06~08 (템플릿) → Part 5 (HAL)

#핵심 원칙

#1. 측정 가능한 주장만 한다

  • “빠르다” → “어셈블리 N줄, 사이클 M개”
  • “안전하다” → “컴파일 타임에 검증됨”
  • Godbolt(Compiler Explorer)로 확인

#2. 대안을 제시한다

  • “이건 쓰지 마세요” → “대신 이걸 쓰세요”
  • 금지만 하지 않고 해결책 제공

#3. C를 비하하지 않는다

  • C가 더 적합한 상황도 있음
  • 부트 코드, 극소형 MCU, 인증 제약

#핵심 질문

시리즈 전체를 관통하는 질문:

  1. 이 기능이 런타임 비용을 추가하는가?
  2. 이 기능이 디버깅을 더 쉽게 만드는가?
  3. 이 기능이 코드 품질을 끌어올리는가?
  4. 바이너리 크기가 감당 가능한가?

#대상 환경

항목기준
아키텍처ARM Cortex-M/A, RISC-V
OSbare-metal, FreeRTOS, Zephyr
컴파일러GCC, Clang, ARM Compiler
플래그-fno-exceptions, -fno-rtti
할당정적 우선, 제한된 동적
중요 지표코드 크기, latency, determinism

#컴파일러 플래그 가이드

# 기본 설정
CXXFLAGS += -std=c++17
CXXFLAGS += -fno-exceptions
CXXFLAGS += -fno-rtti
CXXFLAGS += -fno-threadsafe-statics
# 최적화
CXXFLAGS += -Os # 또는 -O2
CXXFLAGS += -flto # Link Time Optimization
# 경고
CXXFLAGS += -Wall -Wextra -Wpedantic
CXXFLAGS += -Werror
# ARM 특화
CXXFLAGS += -mcpu=cortex-m4
CXXFLAGS += -mthumb
CXXFLAGS += -mfloat-abi=hard

#사전 지식

  • C 프로그래밍 (포인터, 구조체)
  • 기본적인 C++ 문법
  • 임베디드 기초 (레지스터, 인터럽트)
  • 컴파일/링크 과정 이해

#레퍼런스

서적

  • Effective Modern C++ - Scott Meyers
  • C++ Core Guidelines - Stroustrup & Sutter
  • Real-Time C++ (4th ed) - Christopher Kormanyos
  • Large-Scale C++ Volume I - John Lakos

온라인

컨퍼런스

  • CppCon Embedded Track
  • Meeting C++ Embedded
  • Embedded World

#이 시리즈의 목표

이 시리즈를 완주하면:

  • C++ 도입 여부를 판단할 수 있다
  • zero-cost abstraction을 활용할 수 있다
  • 메모리 안전한 코드를 작성할 수 있다
  • 예외/RTTI 없이 설계할 수 있다
  • 하드웨어를 타입 안전하게 추상화할 수 있다
  • 코드 bloat를 통제할 수 있다

다음 글: Part 1-01: C++ vs C: 무엇이 다른가

Embedded C++ for Real Systems · 1 of 41

  1. 1Embedded C++ for Real Systems — 임베디드 모던 C++ 시리즈 소개
  2. 2임베디드 C++ vs C — 런타임·코드 크기·ABI 관점 비교
  3. 3임베디드 C++ 컴파일러 플래그 분석 — -fno-rtti·-fno-exceptions·-Os
  4. 4임베디드 C++ 런타임 요구사항 — libstdc++·newlib·crt0 분석
  5. 5C++ 코드 크기 분석 — 가상 함수·템플릿·예외 비용 추적
  6. 6C++ ABI 호환성 — Itanium ABI·name mangling·vtable 레이아웃
  7. 7C++ 스타트업 코드 분석 — .init_array·전역 생성자 호출 순서
  8. 8임베디드 C++ 링커 스크립트 — vtable·정적 객체 배치 추적
  9. 9임베디드 C++ 표준 선택 가이드 — C++11/14/17/20/23 트레이드오프
  10. 10임베디드 RAII 기초 — 리소스 안전성과 결정적 소멸 보장
  11. 11임베디드 RAII 실전 패턴 — Lock·Pin·DMA·Power 관리
  12. 12constexpr 기초와 임베디드 적용 — 컴파일 타임 계산 활용
  13. 13constexpr 고급 활용 — 룩업 테이블·CRC·해시 컴파일 타임 생성
  14. 14consteval과 constinit 분석 — C++20 컴파일 타임 강제 메커니즘
  15. 15임베디드 Templates 기초 — 타입 안전과 코드 재사용 분석
  16. 16Template 비용 분석 — 코드 폭증·인스턴스화·디버그 정보 측정
  17. 17CRTP 패턴 분석 — vtable 없는 정적 다형성
  18. 18Type Traits 임베디드 활용 — SFINAE·is_pod·컴파일 타임 검사
  19. 19C++20 Concepts 활용 — 템플릿 제약과 가독성 개선
  20. 20동적 할당 없는 임베디드 C++ — placement new·정적 객체·풀
  21. 21Custom Allocator 기초 — std::allocator 인터페이스 분석
  22. 22Pool Allocator 구현 — Fixed-Size Block과 O(1) 보장
  23. 23std::pmr 임베디드 활용 — Polymorphic Memory Resource 분석
  24. 24No-Exception C++ 설계 — 코드 크기·결정성 트레이드오프
  25. 25임베디드 에러 처리 패턴 — Result·errno·optional 비교
  26. 26std::expected 분석 — C++23 결과 타입과 에러 전파
  27. 27No-RTTI C++ 설계 — dynamic_cast 제거와 정적 타입 분기
  28. 28임베디드 스마트 포인터 선택 — unique·shared·custom 비교
  29. 29임베디드 C++ 소유권 모델 — single·shared·borrow 패턴
  30. 30Intrusive Containers 분석 — 동적 할당 없는 컨테이너 설계
  31. 31ETL 라이브러리 분석 — Embedded Template Library의 STL 대체
  32. 32임베디드 Lock-free 기초 — atomic·memory ordering·CAS
  33. 33Lock-free Container 구현 — SPSC Queue·Ring Buffer
  34. 34Type-safe Flags 패턴 — Enum Class·Strong Typedef·Tag
  35. 35임베디드 State Machine 패턴 — Variant·Visitor·Table-driven 비교
  36. 36Compile-time FSM 구현 — 템플릿으로 상태 전이 검증
  37. 37Singleton 대안 패턴 — Service Locator·Static Init·Phantom
  38. 38MMIO Register 추상화 — 타입 안전한 비트 필드 접근
  39. 39GPIO 추상화 패턴 — Template·Concept으로 보드 독립성
  40. 40Peripheral 추상화 — UART·SPI·I2C 공통 인터페이스 설계
  41. 41임베디드 HAL 설계 패턴 — Static·Dynamic·Hybrid 비교