-
[C++] const와 constexpr 차이프로그래밍/C & C++ 2024. 7. 23. 06:05728x90반응형
const
와constexpr
는 둘 다 상수를 정의하는 데 사용되지만, 서로 다른 방식으로 작동하고, 다양한 용도로 사용됩니다. 다음은const
와constexpr
의 차이점에 대한 설명입니다.const
(Constant)const
키워드는 변수의 값을 변경할 수 없음을 나타냅니다.- 컴파일 타임 또는 런타임에 초기화될 수 있습니다.
- 초기화된 후 값을 변경할 수 없습니다.
- 일반적으로 런타임 상수를 나타낼 때 사용됩니다.
예시:
const int x = 10; // x는 변경할 수 없는 상수 int y = 20; const int* ptr = &y; // ptr은 y를 가리키는 상수 포인터, 하지만 y의 값은 변경 가능 // Error: x is const // x = 20;
constexpr
(Constant Expression)constexpr
키워드는 변수, 함수, 또는 객체가 컴파일 타임에 상수 표현식인지 나타냅니다.- 컴파일 타임에 평가될 수 있어야 합니다.
- 주로 컴파일 타임 상수를 나타내는 데 사용됩니다.
- 함수와 함께 사용하면, 함수가 컴파일 타임에 평가될 수 있음을 나타냅니다.
예시:
constexpr int x = 10; // x는 컴파일 타임 상수 constexpr int square(int n) { return n * n; } constexpr int y = square(5); // y는 컴파일 타임에 계산된 상수 // Error: y is constexpr // y = 30;
차이점 요약
- 컴파일 타임 평가:
const
: 런타임 상수일 수 있으며, 반드시 컴파일 타임에 평가될 필요는 없습니다.constexpr
: 컴파일 타임 상수여야 하며, 컴파일 타임에 평가될 수 있어야 합니다.
- 사용 용도:
const
: 변수의 값을 변경할 수 없음을 나타냅니다. 일반적으로 런타임 상수를 나타냅니다.constexpr
: 컴파일 타임 상수를 나타내며, 컴파일 타임에 평가될 수 있는 상수 표현식을 정의합니다.
- 함수 사용:
const
: 함수와 함께 사용하지 않습니다.constexpr
: 함수와 함께 사용하여, 해당 함수가 컴파일 타임에 평가될 수 있음을 나타냅니다.
예시 코드 비교
#include <iostream> // const 사용 예시 void constExample() { const int a = 10; // 컴파일 타임 상수 int b = 20; const int* ptr = &b; // 상수 포인터 // ptr이 가리키는 값은 변경 가능 b = 30; std::cout << "const a: " << a << std::endl; std::cout << "const ptr: " << *ptr << std::endl; } // constexpr 사용 예시 constexpr int factorial(int n) { return (n <= 1) ? 1 : (n * factorial(n - 1)); } void constexprExample() { constexpr int num = 5; constexpr int result = factorial(num); // 컴파일 타임 평가 std::cout << "constexpr result: " << result << std::endl; } int main() { constExample(); constexprExample(); return 0; }
constExample
함수에서는const
키워드를 사용하여 상수를 정의하고, 상수 포인터를 사용합니다.constexprExample
함수에서는constexpr
키워드를 사용하여 컴파일 타임 상수와 컴파일 타임 평가 함수인factorial
을 사용합니다.
이 예시를 통해
const
와constexpr
의 사용 목적과 차이를 명확히 이해할 수 있습니다.728x90반응형'프로그래밍 > C & C++' 카테고리의 다른 글
[C++] 객체지향 프로그래밍(OOP, Object-Oriented Programming) (1) 2024.10.07 [C++] Forward Declaration(전방 선언) (0) 2024.07.28 [C++] History (C++11~20) (3) 2024.07.15 [C++] L-Value & R-Value (0) 2024.07.15 [C++] 연산자 다중 정의 (Operator Overloading) (0) 2024.07.08