[C++] #define과 const
[C++] #define과 const
#define과 const의 차이: 코드 크기와 메모리 효율
C++에서 상수를 정의할 때 #define과 const 둘 중 어떤 것을 사용하는지에 따라 최종 실행 파일의 코드 크기와 메모리 효율이 달라질 수 있습니다. 특히, 이펙티브 C++에서 언급되는 부동소수점 상수와 관련된 설명을 중심으로 차이점을 알아보겠습니다.
1. 핵심 차이: #define과 const
(1) #define 매크로
1
#define ASPECT_RATIO 1.653
- 전처리기 단계에서 텍스트 치환이 일어남.
- 코드에 등장하는 모든
ASPECT_RATIO가1.653으로 바뀜.
(2) const 상수
1
const double AspectRatio = 1.653;
- 타입이 명시된 상수.
- 메모리에 한 번만 저장되고, 사용 시 메모리 참조 또는 컴파일러 최적화로 효율적 사용.
2. 최종 코드 크기의 차이
(1) #define의 경우
1
2
double width = 10 * ASPECT_RATIO;
double height = 5 * ASPECT_RATIO;
전처리 결과
1
2
double width = 10 * 1.653;
double height = 5 * 1.653;
1.653이라는 부동소수점 상수가 코드에 중복 삽입됨.- 최종 목적 코드(기계어)에 1.653이라는 리터럴이 여러 번 포함되어 코드 크기가 증가할 수 있음.
(2) const의 경우
1
2
3
const double AspectRatio = 1.653;
double width = 10 * AspectRatio;
double height = 5 * AspectRatio;
컴파일 최적화 결과
- AspectRatio는 메모리에 한 번만 저장됨.
- width, height 계산 시 이 값을 참조하거나 컴파일러가 상수를 복사해 최적화.
- 코드 크기가 불필요하게 커지지 않음.
3. 코드 크기란?
코드 크기(Code Size) 란 다음을 의미합니다:
| 구분 | 설명 |
|---|---|
| 실행 파일 크기 | 컴파일 후 생성된 실행 파일(.exe, .out)의 용량 |
| 메모리에서의 코드 영역 | 프로그램 실행 중 명령어와 상수 리터럴이 차지하는 메모리 크기 |
매크로 방식은 상수가 중복되어 실행 파일 크기가 커질 수 있음. 반면 const는 상수가 한 번만 저장되므로 더 효율적.
4. 예제 비교 및 결과
매크로 사용
1
2
3
#define BIG_NUMBER 12345678.98765
double a = BIG_NUMBER;
double b = BIG_NUMBER;
- 최종 기계어 코드에
12345678.98765라는 리터럴이 두 번 들어감.
const 사용
1
2
3
const double BigNumber = 12345678.98765;
double a = BigNumber;
double b = BigNumber;
BigNumber는 한 번만 메모리에 저장되고 참조됨.
5. 컴파일 후 코드 크기 확인
리눅스
1
2
size macro_version
size const_version
출력 예시:
1
2
3
text data bss dec hex filename
1024 128 16 1168 490 macro_version
768 128 16 912 390 const_version
text: 코드 크기data: 초기화된 전역 변수 영역
매크로 사용 버전이 text 영역 크기가 더 큼.
6. 결론
| 구분 | #define 매크로 | const 상수 | |———————|—————————————|——————————————| | 치환 방식 | 전처리기에 의해 텍스트 치환 | 컴파일러가 상수를 메모리에 할당 | | 중복 여부 | 사용한 위치마다 상수값이 직접 삽입 | 메모리에 한 번만 저장, 참조 | | 코드 크기 | 중복 삽입으로 인해 커질 수 있음 | 메모리 효율적으로 사용됨 | | 유지보수 | 타입 정보 없음, 실수 발생 가능 | 타입 안전, 가독성 및 유지보수 좋음 |
따라서 상수를 정의할 때는 #define보다는 const를 사용하는 것이 권장됨.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.