본문 바로가기
언어/C, C++

[C++] #define, constexpr, PROGEM 비교

by minhyeok.lee 2024. 10. 27.
반응형

#define vs constexpr vs PROGEM

#define, constexpr, 그리고 PROGMEM은 C++ 및 임베디드 프로그래밍에서 상수를 정의하고 메모리를 관리하는 데 사용되는 방법이다.

이들은 각각 상수 정의, 컴파일 타임 평가, 메모리 최적화 측면에서 차이점이 있다.

임베디드 환경에서의 어떤 상황에서 가장 적합한지 정리한다.


비교 요약(표)

특징 #define constexpr PROGEM
타입 안전성 낮음 높음 보통
컴파일 타임 컴파틸 타임 치환 컴파일 타임 평가 컴파일 타임 설정
메모리 사용 텍스트 치환 (작음) 플래시/레지스터 (작음) 플래시 메모리 (RAM 절약)
스코프관리 없음 (전역적) 있음 (지역적 가능) 전역적
읽기 속도 빠름 빠름 느림 (플래시 읽기 필요)
코드 복잡성 낮음 보통 높음

제한된 임베디드 환경에서의 추천

1. 작고 정적인 상수

- constexpr이 가장 적합하다.

- 타입 안전성과 컴파일 타임 평가의 이점이 있다.

- RAM을 전혀 사용하지 않으므로 메모리 효율적이다.

 

2. 큰 배열 또는 정적 데이터

- PROGMEM을 사용하는 것이 유리하다.

- 이는 RAM을 절약하고, 플래시 메모리를 효율적으로 사용할 수 있게 한다.

- 다만, 읽을 때 pgm_read_* 함수를 사용해야 함을 유의해야 한다.

 

3. 단순한 상수 정의

- 작은 프로젝트나 빠르게 변하는 상수를 설정할 때는 #define도 여전히 유효한 방법이다.

- 다만, 타입 안전성과 유지보수성 측면에서 장기적으로는 constexpr이 더 나은 선택이다.


결론

1. 타입 안전성과 컴파일 타임 평가가 중요한 경우, 특히 작은 상수에는 constexpr을 사용하는 것이 가장 좋다.

2. RAM을 절약해야 하거나 큰 데이터를 저장할 필요가 있다면, PROGMEM을 사용하는 것이 좋다.

3. 단순한 정의와 빠른 개발이 필요한 경우라면, #define을 사용할 수 있다.

반응형

'언어 > C, C++' 카테고리의 다른 글

[C++] PROGEM  (0) 2024.10.26
[C++] constexpr  (0) 2024.10.25
[C++] #define  (0) 2024.10.24
[C, C++] 모든 타입 정리  (0) 2024.04.24
[C++] constexpr이란? const와 constexpr의 차이 ( const vs constexpr )  (0) 2024.01.08

댓글