"(c++20) consteval, constinit"
C++20์ ์ถ๊ฐ๋ Language ์ค consteval, constinit์ ๋ํด์ ์์๋ณด๊ณ ๊ธฐ์กด์ ์์๋ const์ constexpr๊ณผ ๋น๊ตํด๋ณด๋ ค๊ณ ํ๋ค. ์ผ๋จ ์ด๋ค ๋จ์ด์ ์ค์๋ง์ธ์ง ํ์ธํ๊ณ ๋์ด๊ฐ์ ~
- const: Constant ์์
- constexpr: Constant Expression ํํ// c++11
- consteval: Constant Evaluation ๊ฒ์ฆ // c++20
- constinit: Constrant Initialization ์ด๊ธฐํ // c++20
ํจ์์ ํค์ํธ๋ฅผ ๋ถ์์ ๋, ๋ณ์์ ํค์๋๋ฅผ ๋ถ์์ ๋๋ฅผ ๋๋ ์ ์ ๋ฆฌํด๋ณด์๋ค.
1. ํจ์ (์ผ๋ฐ vs constexpr vs consteval)
๋จผ์ ์ ํํด์ผ ํ ๊ฐ๋ ์ ๋ฐํ์(RunTime)๊ณผ ์ปดํ์ผ(Compile)ํ์์ด๋ค.
๊ฐ๋จํ๊ฒ ๊ฒ์์ด๋ผ๊ณ ๊ฐ์ ํ ๋ ์คํํ๋ก๊ทธ๋จ์ด ๋ง๋ค์ด์ง๋ ๊ณผ์ ์ด ์ค๋ ๊ฑธ๋ฆฌ๋๋ผ๋ ๊ฒ์์ ์คํ ํ ๊ฒ์์ ํ ๋ ๋ฒ๋ฒ ์ด์ง ์๋๊ฒ ๋ ์ค์ํ๋ค. ์์ค์ฝ๋๋ฅผ ์คํ๊น์ง ํ๋ ๊ณผ์ ์ ์๋์ ๊ฐ๋ค.
Build → Compile(Compile Time) → Link → ์คํํ์ผ(.exe) → ์คํ( RunTime )
- Compile Time: ์์ค์ฝ๋๋ฅผ ์ปดํ์ผ์ด๋ผ๋ ๊ณผ์ ์ผ๋ก ์คํํ์ผ์ ๋ง๋๋ ๊ณผ์
- RunTime: ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ด ์คํ๋๊ณ ์๋ ๋์์ ๋์
์ฐ๋ฆฌ๊ฐ ๋ง๋๋ ํจ์๋ ์๋ฌด๋ฐ ํค์๋ ์์ด๋ "๋ฐํ์"์ ๋์์ ํ๋ค. ๋น์ฐํ ๋ฐํ์์ ๊ณ์ฐ์ด ๋์ด์ผํ๋ ํจ์๊ฐ ์๊ฒ ์ง๋ง "์ปดํ์ผ"์ ๊ณ์ฐ์ด ๋์ด๋ ์๊ด์ด ์๋ค๋ฉด "๋ฐํ์"์ ์ฐ์ฐ์ ๋๋๋ก ํ์ง ์๋๋ก ํ๋๊ฒ์ด ๊ฒ์์ ํ๋ ์ดํ๋๋ฐ ์ข๋ค.
์ฝ๋๋ก (์ผ๋ฐ vs constexpr vs consteval) ์ฌ์ฉ๋ฒ์ ์์๋ณด์.
int RunTime(int n)
{
return n * n;
}
// c++11
// constexpr: ์ต๋ํ ์ปดํ์ผ ํ์
constexpr int RunOrCompileTime(int n)
{
return n * n;
}
// c++20
// consteval: 100% ์ปดํ์ผ ํ์
consteval int CompileTime(int n)
{
return n * n;
}
int main(void)
{
// [1]๋ฒ๊ตฌ๊ฐ ===================================================
int val1 = RunTime(10);//ok
int val2 = RunOrCompileTime(10);//ok
int val3 = CompileTime(10);//ok
// [2]๋ฒ๊ตฌ๊ฐ ===================================================
enum EnumTest // <- enum์ compile Time์ ํ์ ๋์ด์ผ ํ๋ค.
{
VAL_1 = RunTime(10),//error
VAL_2 = RunOrCompileTime(10),//ok
VAL_3 = CompileTime(10),//ok
};
// [3]๋ฒ๊ตฌ๊ฐ ===================================================
int a = 10; // <- Stack
int val1 = RunTime(a);// ok
constexpr int val2 = RunOrCompileTime(a); // error
int val2 = RunOrCompileTime(a);// ok
int val3 = CompileTime(a);// error
return 0;
}
(1). [1๋ฒ] ๊ตฌ๊ฐ
์ปดํ์ผ ํ์์ด๋ ๋ฐํ์์ด๋ ๋๋ค ๋ฌธ์ ์๊ธฐ ๋๋ฌธ์ error๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
๐Tip. ์ปดํ์ผ ํ์์์ ๋ง๋ค์ด์ง๋์ง ๋ฐํ์์์ ๋ง๋ค์ด์ง๋์ง ๊ฐ์ฅ ํ์คํ๊ฒ ๋ณผ ์ ์๋ ๋ฐฉ๋ฒ์?
๋๋ฒ๊น ์ ํด๋ณด๋ ๊ฒ์ด๋ค.!! ๋๋ฒ๊น → ์ฐฝ → ๋์ค์ด์ ๋ธ๋ฌ ๋ก ํ์ธํด๋ณด์.
์ฌ์ง์ [1]๋ฒ ๊ตฌ๊ฐ ๊ธฐ๊ณ์ด ์ฝ๋ ์ธ๋ฐ CompileTimeํจ์๋ง 64์ง์๋ก ๋ฐ๋ก mov val3 64h val3์ 64h ์์๋ฅผ ๋ฎ์ด์์ด๋ผ. ํ๊ณ ์๋ค. ์ด๋ ์ปดํ์ผํ์์ ๊ณ์ฐ์ด ๋ฏธ๋ฆฌ๋์ด์๊ธฐ ๋๋ฌธ์ ์ ํจ์ RunTime๊ณผ RunOrCompileTime์ฒ๋ผ ์์๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ํจ์๋ฅผ ๋ถ๋ฅด๋ ๊ณผ์ ์ ์๋ตํ๊ณ ์๋ ๊ฑธ ๋ณผ ์ ์๋ค.
(2). [2๋ฒ] ๊ตฌ๊ฐ
enum์ stack์ ์ ์ฅ๋๋ฉฐ ์ปดํ์ผ ํ์์ ์ ํด์ ธ์ผ ํ๋ค. ์ฆ consteval์ error๋ฅผ ๋ฑ๋๋ค.
(3). [3๋ฒ] ๊ตฌ๊ฐ
a๋ ๋ณ์์ด๋ฏ๋ก a๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋ ๋ฐํ์ ํจ์๊ฐ ๋ถ๋ ค์ผ ํ๋ค. ์ฌ๊ธฐ์ ํ์ธ ํ ์ ์ constexpr int val2 = RunOrCompileTime(a); // error
int val2 = RunOrCompileTime(a);// ok
์ด ๋์ ์ฐจ์ด์ธ๋ฐ constexpr๋ ํจ์์ ๋ถ์ด๋ฉด ์ต๋ํ ์ปดํ์ผ ํ์์ ๊ณ์ฐํ๊ฒ ๋ค๋ ๋ป์ด์ง๋ง ๋ณ์์ ๋ถ์ด๋ฉด ๋ฌด์กฐ๊ฑด ์ปด.ํ.์ผ. ํ์ ์์์ด๋ฏ๋ก RunOrCompileTime(a)๋ ๋ฐํ์ ๊ณ์ฐ์ด ๋๋ฏ๋ก ์์๊ฐ์ ๋ฑ์ ์ ์๊ธฐ ๋๋ฌธ์ error๋ฅผ ๋ฑ๋๋ค.
2. ๋ณ์ ( const vs constexpr vs constinit)
์ด์ ๋ณ์์ ํค์๋๋ฅผ ๋ถ์ผ ๋ ์๋ฏธ๋ฅผ ํ์ธํด๋ณด์.
// [1๋ฒ]๊ตฌ๊ฐ const ==============================================
const int constintval = sqrRunTime(10);
constintval++; //error
// [2๋ฒ]๊ตฌ๊ฐ constexpr ==========================================
constexpr int constExprVal = sqrCompileTime(10);
constExprVal++; //error
// [3๋ฒ]๊ตฌ๊ฐ constinit ==========================================
constinit thread_local int constlnitVal = sqrRunOrCompileTime(10);
(1). [1๋ฒ] ๊ตฌ๊ฐ const
- ์ปดํ์ผํ์/๋ฐํ์ + constness(์ ๋๋ก ๋ณํ๋ฉด ์๋๋ค. ์์์ฑ)ํ์ํ๋ค.
- const ๋ณ์์ ์ด๊ธฐํ๋ ๋ฐํ์๊น์ง ์ง์ฐ์ํฌ ์ ์๋ค.
(2). [2๋ฒ] ๊ตฌ๊ฐ constexpr
- ์ปดํ์ผํ์ + constness
constexpr ํจ์์ ๋ถ์ผ๋ฉด ๋ฐํ์ ํน์ ์ปดํ์ผ ํ์ ๋ชจ๋ ๋์ง๋ง
constexpr ๋ณ์์ ๋ถ์ผ๋ฉด ์ปด.ํ.์ผ ํ์
(3). [3๋ฒ] ๊ตฌ๊ฐ constinit
- ์ปดํ์ผํ์ + constness(x) + static/thread_local
- global ๋ณ์, static ๋ณ์, thread_local ๋ณ์๋ฅผ ๋์์ผ๋ก ์ฌ์ฉํ๋ค.
- ํ๋ก๊ทธ๋จ ์์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น, ํ๋ก๊ทธ๋จ์ด ๋๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ํด์ ๋๋ค.
- thread_local ๋ณ์๋ thread์ ์ข
์์ฑ, ํน์ thread๊ฐ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๋ ์์ฑ๋๋ค.
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif)
๋ฐ์ด์ฉ ~
๋ด์ฉ ์ถ์ : ์ธํ๋ฐ Inflearn - Rookiss ์ค ๊ฐ์์ธ C++20 ํ์ด๋ณด๊ธฐ ์ค.
'๐จ๐ปโ๐ป programming > โฝ c, c++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
(c++20) Conditional Explicit Constructor (0) | 2024.06.17 |
---|---|
(c++20) [Three-way Comparsion(3๋ฐฉํฅ ๋น๊ต ์ฐ์ฐ์)/์ฐ์ฃผ์ ] ์ฐ์ฐ์ (0) | 2024.06.14 |
[c++17] ์ ๋ฌธ์๋ฅผ ์ํ c++17 ์๋ก์ด ๋ด์ฉ ๋ถ๋งํฌ (0) | 2024.03.11 |
[C++] Map์ Key๋ก Class/Struct ๋ฃ๊ธฐ (2) | 2023.08.11 |
(c++) ์ธ์ฝ๋ฉ(Encoding),์ ๋์ฝ๋(Unicode), ๋ก์ผ์ผ, ํจ์ฏ (0) | 2022.09.07 |
์ ํ๋ ๊ฒ ๋ณด๋ค ๋ซ๊ฒ ์ง
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!