포스트

[C++] #define과 const

[C++] #define과 const

#define과 const의 차이: 코드 크기와 메모리 효율

C++에서 상수를 정의할 때 #defineconst 둘 중 어떤 것을 사용하는지에 따라 최종 실행 파일의 코드 크기와 메모리 효율이 달라질 수 있습니다. 특히, 이펙티브 C++에서 언급되는 부동소수점 상수와 관련된 설명을 중심으로 차이점을 알아보겠습니다.

1. 핵심 차이: #define과 const

(1) #define 매크로

1
#define ASPECT_RATIO 1.653
  • 전처리기 단계에서 텍스트 치환이 일어남.
  • 코드에 등장하는 모든 ASPECT_RATIO1.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 라이센스를 따릅니다.