C programming - minsuk-jang/teamproject GitHub Wiki
sizeof(<var>)
vs sizeof(<type>)
์ฌ๋ฌ๋ถ์ ์ ๋ง๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค : ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ์ ์ฐจ์ด [...] ๋ณ์๊ฐ simple (int, long, ...)์ด๋ฉด 'sizeof (variable)'๋ฅผ ์ฌ์ฉํ๊ณ ๋ณ์๊ฐ complex (struct, pointer-to-pointer)๋ผ๋ฉด 'sizeof (the_actual_type )`๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋ด๋ถ ๋ฒ์์์ ํ ๋น ๋ ํฌ์ธํฐ์ ์ ๊ทผ ํ๋๊ฒ์ ** ์ ์๋์ง ์์ ๋์ **์ ๋๋ค.
https://github.com/neovim/neovim/pull/656#issuecomment-41905534
TODO: legacy Vim struct hack์ ๋ํ ํ ๋ก ๋งํฌ
-
signed ๋ณ์๋ฅผ unsigned๋ก ๋ณํ (
-Wconversion
์ ์ํด ์ฒดํฌ๋์ง ์์ ํ์ผ๋ค์์)
๋ถํธ์๋ ์ ํ๊ณผ ๋ถํธ์๋ ์ ํ์ ์ ํํ๋ ๋์ ์ ์ํด์ผ ํ ๋ช ๊ฐ์ง ์ค์ํ ์ฌํญ์ด ์์ต๋๋ค.
์ฒซ์งธ, unsigned overflow๊ฐ ์ ์๋๊ณ ** signed overflow๋ ์ ์๋์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋ถํํ ์ญ์ฌ์ ์ค์๋ก์, signed ์ ์๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ๋ฌด์์ธ์ง ํ์คํ์ง ์์ ๋๋ก๋ถํฐ ์ ๋ํฉ๋๋ค. C ํ์ค์ ๊ฐ ํํ์ด ๋ค๋ฅธ ๋์์ ํ๊ธฐ ๋๋ฌธ์ signed ์ ์๊ฐ overflows ๋ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ ์ง๋ฅผ ์ง์ ํด์๋ ์๋๋ฉฐ / ์ง์ ํ ์ ์์ด์ผ ํ๋ค๊ณ ๊ฒฐ์ ํ์ต๋๋ค. ํ๋์์๋ ๋ถํธ์๋ ์ ์๊ฐ ํญ์ 2์ ๋ณด์ ํ์์ผ๋ก ํํ๋ฉ๋๋ค. ์ด ํ์์ ๋ง์ ์ฅ์ ์ด ์์ต๋๋ค.
ํฅ๋ฏธ๋ก์ด ์ ์ gcc์ clang์ด passing the -fwrapv flag์ ์ฌ์ฉํ์ฌ signed overflow๋ฅผ ์ ์๋ ๋๋ก ๋ณผ ์ ์๊ฒ ํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๋ถํํ๊ฒ๋ ๋นํ์ค ์ ๋๋ค.
์ ์๋ ๊ฒ๊ณผ ์ ์๋์ง ์์ ๊ฒ์ ๋ฌด์์ ์๋ฏธํฉ๋๊น? unsigned ์ ์๊ฐ overflows๋๋ฉด 0์ผ๋ก ๋๋๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ signed ์ ์๊ฐ overflows๋๋ ๊ฒฝ์ฐ $ ์ (็ฅ)์ ์ผ์ด๋ ์ผ๋ง ์๊ณ ์์ต๋๋ค. ๋ ๊ตฌ์ฒด์ ์ผ๋ก : ์ฐ๋ฆฌ๋ 2๊ฐ์ ๋ณด์ signed ์ ์๊ฐ overflow ๋ ๊ฒฝ์ฐ ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๋์ง ์ ์ ์์ง๋ง ์ปดํ์ผ๋ฌ๋ ํ์ค์ด ์ ์๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ํ๋๋๋ก ํ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก, ์ต์ ํ ์ปดํ์ผ๋ฌ๋ ์ข ์ข unsigned ์ ์๊ฐ overflow ํ ์ ์๋ค(mahkoh์ ์ ์๋์ง ์์ ๋์ ์์ ๋ฅผ ์ฌ๊ธฐ์ ์ฝ์ ํ์ญ์์ค)๋ผ๊ณ ๊ฐ์ ํ๊ณ ์ผ๋ถ ๋ถ๊ธฐ ๋๋ ๋น๊ต๋ฅผ ์ต์ ํ ํฉ๋๋ค. ์ด ๋์์ผ๋ก ์ธํด ๋ฃจํ๊ฐ ์๊ตฌ์ ์ผ๋ก ์คํ๋ ์ ์์ต๋๋ค. ์กฐ๊ฑด์ด ์ฃผ์ ๊น๊ฒ ์ฐ์ฌ์ง์ง ์๋๋ค๋ฉด, unsigned ์ ์์ ์ ์ ์๋ wraparound overflow๊ฐ ๋น ์ข ๊ฒฐ ๋ฃจํ (non-terminating loops)๋ฅผ ์ผ์ผํฌ ์ ์๋ค๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค. '(U) INTX_MAX / MIN`์ ์ฌ๋ฌ๋ถ์ ์น๊ตฌ์ ๋๋ค.
๋ฐ๋ผ์ unsigned ์ฐ์ ์ over ๋ฐ underflow๋ฅผ ์ ์ํ์ผ๋ฏ๋ก ์ฐ์ํ๋ค๊ณ ํ๋จ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ํญ์ ์ฌ์ค์ด ์๋๋๋ค.
๋ง์ ์ธ์ด (์ : Java)๊ฐ unsigned ์ ํ์ ๋
ธ์ถ์ํค์ง ์๋ ๋ฐ๋ ์ข์ ์ด์ ๊ฐ ์์ต๋๋ค.
์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ๊ธฐ๊ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. *
ํ๋ฆ์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ํํ๋ unsigned ์ฐ์ ์์์ underflow์
๋๋ค.
unsigned int num = 0;
์์ 1์ ๋บ ๊ฒ์ UINT_MAX
๋ก ๊ฐ์ธ์ค๋๋ค.
์ด๊ฒ์ ์๊ฐํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ์ผ๋ฐ์ ์
๋๋ค.
์ด๋ฐ ์ด์ ๋ง์ผ๋ก๋ ๋ณดํต int
๋ฅผ uint32_t
/size_t
/... ๋๋
๋ค๋ฅธ unsigned ํ์
๋์ ์ ๋ฃจํ ์นด์ดํฐ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์์ ํฉ๋๋ค.
**. ์๋ จ ๋ ํ๋ก๊ทธ๋๋จธ๋ผ๋ ์ผ๋ถ ๊ฒฝ์ฐ underflow๊ฐ ๋ฐ์ํ์ง ์๋ unsigned ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ํผํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
๊ทธ๋์ ** ๋ฌธ์ ** : ์ฌ๋ฐ๋ฅธ ์๋ช
๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ ์ฝ์ง๋ง 'size_t'์ ๋น๊ตํ ๋ casts๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
(sizeof
, strlen
๋ฑ์ ๋ฐํ ์ ํ์ด๋ฏ๋ก ์์ฃผ ๋ฐ์ํฉ๋๋ค). casts๋ ์ถ์
ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ฉด ํผํด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด๋์์๋ ๊ทธ๊ฒ๋ค์ ํผํ ์๋ ์์ต๋๋ค.
๊ฐ๋ trade-off๊ฐ ์ด๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค. ์์ ๋ ์ด์ -Wconversion
PRs๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๊ฒฐ๋ก :
- underflow๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๊ฑฐ๋ ๋ฌธ์ ์ ๋ฃจํ๊ฐ ์์ผ๋ฉด (์ ํํ๊ฒ '2 ^ 31'ํญ๋ชฉ๋ณด๋ค ์์), ๋ฃจํ ์์ signed ์ฐ์ ๊ณผ guards๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ๋ง์ฝ overflow์ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด, unsigned ์ฐ์ ๊ณผ ๊ฐ๋ฅํ๋ค๋ฉด guards๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- underflow์ overflow์ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ ๋งค์ฐ ์กฐ์ฌํ์ญ์์ค.
char
,short
,int
,long
์ธ์๋ (u) intX_t
์ ์น๊ตฌ๋ค์ ์ฌ์ฉํด์ผ ํ ๊น์? ...
-
size_t
: ... -
rsize_t
:์ด ํ์์ C11 ํ์ค์์ ์๋ก ์ถ๊ฐ ๋์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์์ง๋ง ๊ทธ ๋ค์์๋ ์ถ๋ก ๊ณผ ์ฌ์ฉ๋ฒ์ ํฅ๋ฏธ๋กญ์ต๋๋ค.rsize_t
ํ์ ์ ๋ณ์๊ฐ ๊ฐ์ง ์ ์๋ ์ค์ ์ต๋๊ฐ์RSIZE_MAX
๋์ ** less ** ์ ๋๋ค. ์ฆ, ์์ ์ ๊ณ์ํ๊ธฐ ์ ์val <= RSIZE_MAX
์ธ์ง ํ์ธํ๊ณ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฒซ๋ฒ์งธ ์ ์ฉํ ์์ฑ์ :RSIZE_MAX
์ ๋ํ ๊ฐ์ ๋๊ฐ ๋๋ฌด ์ปค์ ์ด์จ๋ ์ ์ฉํ์ง ์์ต๋๋ค.rsize_t
๊ฐ 64 ๋นํธ๋ผ๋ฉด ๋๊ฐ ๋ง๋ํ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ค๊ณ ํฉ๋๊น? ๋ ผ๋์ ์ฌ์ง๋ ์์ง๋ง ์์ ์ํ์ ๊ฑฐ๋ถํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ ๋ฒ์งธ ์ ์ฉํ ์์ฑ์ unsigned ์ฐ์ ์ด underflow ๋ฌธ์ ์ ๋ ์ทจ์ฝํ๊ฒ ๋ง๋๋๋ฐ ์ข์ต๋๋ค.rsize_t val = -4
์ ๊ฐ์ธ์ก๊ธฐ ๋๋ฌธ์RSIZE_MAX
๋ณด๋ค ํด ๊ฒ์ ๋๋ค.RSIZE_MAX
์ ๋ํด bounds-check๋ฅผ ํ๋ ํจ์๋ ๊ทธ ๊ฐ์ ๊ฑฐ๋ถํฉ๋๋ค. ์ด๊ฒ์ cast(rsize_t
๋ ์๋ช ์ด ์์ด์ผ ํจ)์์ด unsigned ์ฝ๋์ ์ํธ์์ฉํ ์ ์๋ ์ข์ ๋ฐฉ๋ฒ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ signed ์ฐ์ ์ ์์ ์ด์ ์ ์ฌ์ ํ ๊ฐ์ง๊ณ ์์ต๋๋ค.
Neovim๊ณผ ๊ฐ์ด ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์์ฑ, ์ ์ง ๋ฐ ๋ณํํ๋ ๋์ ๋์์ด ๋๋ ์ ์ฉํ ๋๊ตฌ๊ฐ ์์ต๋๋ค. ์ผ๋ถ ๊ธฐ์ฌ :