cpp_constexpr - 8BitsCoding/RobotMentor GitHub Wiki

cpp_constexpr

constexpr์„ค๋ช…์— ์•ž์„œ ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋จผ์ € ๋ณด์ž

// ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ
template <int T>
struct Fibonacci
{
    enum { value = (Fibonacci<T-1>::value + Fibonacci<T-2>::value) };
}

// ์ด ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—๋Š” ์กฐ๊ฑด๋ฌธ์ด ์—†๋‹ค.
// ๊ทธ ๋Œ€์‹  ๊ตฌ์กฐ์ฒด ์˜ค๋ฒ„๋กœ๋”ฉ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ 
// 0, 1, 2์™€ ๊ฐ™์€ ํŠน์ˆ˜ ์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

template <>
struct Fibonacci<0>
{
    enum { value =  1 };
};

template <>
struct Fibonacci<1>
{
    enum { value = 1 };
}

template <>
struct Fibonacci<2>
{
    enum { value = 1 };
}
// Main
int x = Fibonacci<45>::value;
cout << x << endl;
  • ์ด๋ ‡๊ฒŒ ํ•œ ์ด์œ ๋Š” ์‹คํ–‰์‹œ ์ƒ์ˆ˜๊ฐ’์œผ๋กœ ๋„ฃ๊ธฐ์œ„ํ•จ์ธ๋ฐ ... ๊ทธ์— ๋”ฐ๋ฅธ ๋‹จ์ ์€
  • ์ฝ”๋“œ๋ฅผ ๋ณด๊ธฐ ํž˜๋“ค๊ณ 
  • Fibonacci<45>::value; ๊ฐ€ ํ•จ์ˆ˜์ธ๊ฐ€ ์‹ถ์Œ

๊ทธ๋ž˜์„œ constexpr๋กœ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ?

constexpr : ์ปดํŒŒ์ผ๋Ÿฌ์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ˆ๊ฐ€ ์ตœ์ข… ์ ์œผ๋กœ ์ด ๊ฐ’์„ ์ƒ์ˆ˜๋กœ ๋ฐ”๊ฟ”์ค˜

ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ํ•จ์ˆ˜๋กœ!

constexpr unsigend int fibonacci(unsigned int i)
{
    return (i <= 1u) ? i : (fibonacci(i-1) + fibonacci(i-2));
}
  • ์ปดํŒŒ์ผ ์‹œ์— ๊ฐ’ ํ‰๊ฐ€๋ฅผ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ ํƒฌํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋‚จ์šฉ!

  • ์ด๋Ÿฌ์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋ฐœ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ธฐ๋Š” ํ•จ

  • constexpr๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์˜๋„๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•!

  • ์šฐ๋ฆฌ์˜ ์˜๋„๋Š” ์ปดํŒŒ์ผ ๋„์ค‘์— ๊ฐ’์„ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ!

  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ ๋„์ค‘์— ๋ณ€์ˆ˜๋“ค์„ ๊ฒฐ์ •์ง€์–ด ์ค€๋‹ค.

  • ํ•จ์ˆ˜๋Š” ์ตœ๋Œ€ํ•œ ๊ฒฐ์ •์ง€์–ด์ฃผ๋ ค ๋…ธ๋ ฅ!


๊ทธ๋ž˜์„œ ์–ธ์ œ๋˜๊ณ  ์–ธ์ œ์•ˆ๋˜๋Š”๋ฐ??

constexpr int Factorial(int n)
{
    return n <= 1 ? 1 : n * Factorial(n-1);
}

// Main
int value = 3;
int result1 = Factorial(value);             // Ok
constexpr int result2 = Factorial(value);       
// Compile Error : value๊ฐ€ ๋ณ€์ˆ˜์ด๊ธฐ์— ์ปดํŒŒ์ผ๋Ÿฌ ์ž…์žฅ์—์„œ๋Š” ๊ฐ’์„ ์ •ํ•ด์ฃผ์ง€ ๋ชปํ•œ๋‹ค.
constexpr int result3 = Factorial(3);           // Ok

์ถ”๊ฐ€์ ์œผ๋กœ Factorial(30)๋“ฑ ๊ณ„์‚ฐ์ด ๋งŽ์•„์ง€๋ฉด constexpr์„ ๋ชป์“ฐ๊ฒŒ ๋ง‰๋Š”๋‹ค.

constexpr int result3 = Factorial(30); ๋Š” ์ปดํŒŒ์ผ ์—๋Ÿฌ์ž„


const VS constexpr (๋ณ€์ˆ˜)

const

  • ๋ณ€๊ฒฝ์„ ๋ถˆํ—ˆํ•œ๋‹ค.

constexpr

  • ์ปดํŒŒ์ผ ์‹œ์— ํ‰๊ฐ€ํ•ด์ฃผ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.

ํ๋ฏธ...? ์—ญ์‹œ ์˜ˆ์‹œ๋กœ ์„ค๋ช…

const int num = 1;          // Ok
num = 10;                   // Comfile Error

constexpr int num1 = 2;     // Ok
num1 = 10;                  // Comfile Error

int num2 = 3;
constexpr int num3 = num2;  // Comfile Error

const int num4 = 4;
constexpr int num5 = num4;  // Ok

constexpr int num6 = 6;  // Ok
constexpr int num7 = num6;  // Ok

const VS constexpr (ํ•จ์ˆ˜)

const

  • ๋ฉค๋ฒ„ ํ•จ์ˆ˜์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Œ

constexpr

  • ๋ฉค๋ฒ„์™€ ๋น„๋ฉค๋ฒ„ ํ•จ์ˆ˜์— ๋‘˜๋‹ค ์‚ฌ์šฉ๊ฐ€๋Šฅ
  • C++14๋ถ€ํ„ฐ๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Œ
constexpr int Fibonacci(int i) {}       // Ok
int Fibonacci(int i) {} const           // Comfile Error : ์ € ์œ„์น˜์— const์žˆ๋‹ค๋Š” ์ž์ฒด๊ฐ€ ์ปดํŒŒ์ผ ์—๋Ÿฌ์ž„

constexpr int Champion::GetWinCount()   // Ok (C++14)
{
    mWinCount = 10;
    return mWinCount;
}

constexpr int Champion::GetWinCount() const
{
    mWinCount = 10;                     // Comfile Error
    return mWinCount;
}

Example : ๋ฐฐ์—ด์˜ ๊ธธ์ด ์ •ํ•˜๊ธฐ

class FixedArray
{
public:
    // ...
private:
    enum { MAX = 10 };
    int mArray[MAX];
}
class FixedArray
{
public:
    // ...
private:
    static constexpr int MAX = 10;
    int mArray[MAX];
}

ํ•˜์ง€๋งŒ ... enum์ด ๋” ๊น”๋”ํ•˜์ง€ ์•Š๋‚˜?

ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด enum์“ฐ์ž

โš ๏ธ **GitHub.com Fallback** โš ๏ธ