Post

[c++/note] const ์ƒ์ˆ˜

[c++/note] const ์ƒ์ˆ˜

๐Ÿ“– ์ฐธ๊ณ  ์ž๋ฃŒ


[Microsoft Learn] const (C++)

[Microsoft Learn] constexpr(C++)


[Tistory - ๊ฐœ๋ฐœ์ƒˆ๋ฐœ] [C++] constexpr์ด๋ž€? const์™€ constexpr์˜ ์ฐจ์ด


๊ฐœ๋…

๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ์ œํ•œํ•˜๋Š” ํ‚ค์›Œ๋“œ. ๋ณ€์ˆ˜๋ฅผ ์ฝ๊ธฐ ์ „์šฉ(Read-Only)์œผ๋กœ ๋งŒ๋“ ๋‹ค.

const ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐ ๊ฐ’๋„ ํ•จ๊ป˜ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.


const int

1
2
const int a = 10;
a = 20;	// ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • const int a = 10: ๋ณ€์ˆ˜ a๋ฅผ ์ƒ์ˆ˜๋กœ ์„ ์–ธ
    • ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด a๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Œ
  • ์˜ค๋ฅ˜ ์ฝ”๋“œ: C3892 โ€˜aโ€™: const์ธ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.


cf) const int* const

1
2
3
4
5
const int a = 10;
const int* const ptr = &a;

ptr = &b;	// ์˜ค๋ฅ˜
*ptr = 20;	// ์˜ค๋ฅ˜
  • const int*: ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ
  • const int* const: ํฌ์ธํ„ฐ ์ž์ฒด๋„ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ
    • ๊ฐ’๊ณผ ์ฃผ์†Œ ๋ชจ๋‘ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ (๊ฐ’๊ณผ ํฌ์ธํ„ฐ๊ฐ€ ๋ชจ๋‘ ์ƒ์ˆ˜)
    • (const int*) const๋กœ ์ดํ•ดํ•˜์ž! const int*๋ฅผ const ํ•œ ๊ฒƒ


์ปดํŒŒ์ผ๋Ÿฌ ๋™์ž‘ ๊ณผ์ •

์ปดํŒŒ์ผ ํƒ€์ž„ ์ƒ์ˆ˜

1
2
3
4
5
6
7
const int MAX = 10;

int main()
{
	int a[MAX];
	std::cout << MAX << std::endl;
}
  • MAX์˜ ๊ฐ’์ด 10์œผ๋กœ ํ™•์ •

    โžก๏ธ์ปดํŒŒ์ผ๋Ÿฌ๋Š” MAX๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์œ„์น˜์— 10์„ ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค!

  • MAX๋Š” ์‹คํ–‰ ์ค‘์— ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›์ง€ ์•Š์Œ (์‹ค์ œ ๋ณ€์ˆ˜ x)


์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฐ’์ด ๊ฒฐ์ •๋œ ๋ณ€์ˆ˜๋ฅผ ์ƒ์ˆ˜๊ฐ’์œผ๋กœ ์น˜ํ™˜๋  ์ˆ˜ ์žˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ƒ์ˆ˜๋ฅผ ์ง์ ‘ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•ด ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ์ค„์ธ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ const ๋ณ€์ˆ˜๋ฅผ ์น˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ €์žฅ๋จ!


๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์ˆ˜๋กœ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, const ๋ณ€์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค.

1
2
3
4
5
int main()
{
	const char* a = "hi";
	std::cout << a << std::endl;
}
  • ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด "hi"๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ(rodata)์— ์ €์žฅ
  • ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ a๋Š” "hi"์˜ ์ฃผ์†Œ ์ €์žฅโžก๏ธ์Šคํƒ์— ์ €์žฅ!
  • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” a์— ๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ ํ• ๋‹น


์ปดํŒŒ์ผ ํƒ€์ž„ vs ๋Ÿฐํƒ€์ž„ const

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ดˆ๊ธฐํ™” o

  • const int a = 10


์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ดˆ๊ธฐํ™” x (๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ €์žฅ)

  • static const int a = 10
  • const char* a = "hi"
  • const int a[] = {1};


cf) constexpr

์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฐ’์„ ํ™•์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, constexpr๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

1
constexpr int a = 10;
  • ์ปดํŒŒ์ผ ํƒ€์ž„์— a = 10๊ฐ€ ํ™•์ •
    • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ a์˜ ๋ชจ๋“  ์œ„์น˜์— 10์œผ๋กœ ์ดˆ๊ธฐํ™”


๋‹จ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ’์„ ํ™•์ •ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
int main()
{
	int a = 10;
	constexpr int b = a;
	std::cout << b << std::endl;
}

/* ๋นŒ๋“œ ๊ฒฐ๊ณผ */
// (์˜ค๋ฅ˜) C2131: ์‹์ด ์ƒ์ˆ˜๋กœ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • a๋Š” ๋Ÿฐํƒ€์ž„์—์„œ ๊ฐ’์ด ๊ฒฐ์ •๋จ

    • constexpr์€ ์ปดํŒŒ์ผ ํƒ€์ž„์—์„œ ๋ฐ˜๋“œ์‹œ ๊ฐ’์ด ๊ฒฐ์ •๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

      (const๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ)


๋ชจ๋“  constexpr ๋ณ€์ˆ˜๋Š” const ๋ณ€์ˆ˜์ด๋ฏ€๋กœ, ํฌํ•จ๊ด€๊ณ„๋กœ ์ƒ๊ฐํ•˜์ž!

This post is licensed under CC BY 4.0 by the author.

ยฉ yejin. Some rights reserved.