๐ ์์ธ ์ ๋ฆฌ#
- C๋ ์๋ก ๋ค๋ฅธ ์ ํ์ ๊ฐ์ฒด๋ฅผ ๊ฒฐํฉํด์ ๋ฐ์ดํฐ ์ ํ์ ์์ฑํ๊ธฐ ์ํ ๋๊ฐ์ง ์ด์ฉ๊ตฌ..
- struct, union
- 3.9.1 Structures
- ๋ค๋ฅธ ์ ํ์ ๊ฐ์ฒด๋ฅผ ๋จ์ผ ๊ฐ์ฒด๋ก ๊ทธ๋ฃนํํ๋ ๋ฐ์ดํฐ ์ ํ
- structure ๋ด์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ ์ด๋ฆ์ผ๋ก ์ฐธ์กฐ๋จ
- ๋ชจ๋ ๊ตฌ์ฑ์์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์ ์์ญ์ ์ ์ฅ๋๊ณ , structure์ ๋ํ ํฌ์ธํฐ๊ฐ ์ฒซ๋ฒ์งธ ๋ฐ์ดํธ์ ์ฃผ์
- Array๋ ๋น์ทํ๋ค!
- ์ปดํ์ผ๋ฌ๋ ๊ฐ ํ๋์ ๋ฐ์ดํธ ์คํ์ ์ ๋ค๊ณ ์๊ณ .. ๊ทธ๊ฑธ๋ก ์ ์๋ค๊ฐ๋ค ์ฐธ์กฐ
- 3.9.2 Unions
- ๋จ์ผ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ์ ํ์ ๋ฐ๋ผ ์ฐธ์กฐํ ์ ์๋๋ก ํจ
- ์ด๊ฒ ๋ฌด์จ์๋ฆฌ์ง?
- struct์์ char, int[2], double์ด ์๋ค๋ฉด
- char: 0
1, int: 412, double: 16~24๋ฐ์ดํธ๋ก ์ด 24๋ฐ์ดํธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ- ์ฌ์ด๊ณต๊ฐ์ ํจ๋ฉ
- char: 0
- Union์ด์๋ค๋ฉด ๊ฐ์ฅ ํฐ๊ฒ์ ๋ง์ถฐ์ ๊ทธ์ 8๋ฐ์ดํธ ์ฌ์ฉ
- ๊ทธ๋๊ทธ๋ char / int / double๋ก ์ฝ๋ ๊ฒ
- ๊ทผ๋ฐ ๊ทธ๋ผ ์ด๊ฑธ ์์ฐ๋?
- ๊ทธ๋๊ทธ๋ char / int / double๋ก ์ฝ๋ ๊ฒ
- ํ๋ฒ์ char / int / double ์ค ์ฌ๋ฌ ๊ฐ์ ๋์์ ๊ฐ์ง์ง ์์๋!
- ์ฑ
์ ๋์จ ์์ ๋ ๋ฆฌํ๋
ธ๋์๋ง ๊ฐ์ด ์๋ ์ด์ง ํธ๋ฆฌ ๊ตฌ์กฐ์ฒด
- ์ผ์ชฝ๋
ธ๋ ํฌ์ธํฐ, ์ค๋ฅธ์ชฝ๋
ธ๋ ํฌ์ธํฐ, double 2๊ฐ๋ฅผ ๊ฐ์ง๋ค๊ณ ํด๋ณด์
- struct๋ 32๋ฐ์ดํธ, Union์ด๋ผ๋ฉด ์ ๋ฌถ์ด์ 16๋ฐ์ดํธ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ์ผ์ชฝ๋
ธ๋ ํฌ์ธํฐ, ์ค๋ฅธ์ชฝ๋
ธ๋ ํฌ์ธํฐ, double 2๊ฐ๋ฅผ ๊ฐ์ง๋ค๊ณ ํด๋ณด์
- ์ฑ
์ ๋์จ ์์ ๋ ๋ฆฌํ๋
ธ๋์๋ง ๊ฐ์ด ์๋ ์ด์ง ํธ๋ฆฌ ๊ตฌ์กฐ์ฒด
- ๋ค์ ์์๋ฅผ ๋ณด์.
double uu2double(unsigned word0, unsigned word1) { union { double d; unsigned u[2]; } temp; temp.u[0] = word0; temp.u[1] = word1; return temp.d; }- ์ด๋ word0 = 0x12345678, word1 = 0x9abcdef0 ์ด๋ผ๊ณ ํ๋ฉด
- temp์๋
- Little Endian์ผ๋ 78 56 34 12 f0 de bc 9a
- Big Endian์ผ๋ 12 34 56 78 9a bc de f0
- ๊ฐ ์ ์ฅ๋๋ค.
- ์ด๋ฅผ d๋ก ์ฝ์ ๋
- Little Endian์์๋ 0x9abcdef012345678
- Big Endian์์๋ 0x123456789abcdef0
- ์ผ๋ก ํด์ํ๊ฒ ๋๋ค. (d๋ฅผ ์ฝ์๋๋ endian ์ ๊ฒฝ์ฝํ๋๊น!!)
- ๋จ์ผ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ์ ํ์ ๋ฐ๋ผ ์ฐธ์กฐํ ์ ์๋๋ก ํจ
- 3.9.3 Data Alignment
- ์ผ๋ถ ๊ฐ์ฒด๋ค์ ๋ํ ์ฃผ์๋ 2, 4, 8๋ฑ์ ๋ฐฐ์์ฌ์ผํจ์ ์๊ตฌํ๋ ์ ๋ค์ด ์๋ค
- ์ด๋์ผ ํ๋์จ์ด ์ค๊ณ๊ฐ ๋จ์ํ๋๋ค
- 8์ ๋ฐฐ์๋ก ์ ๋ ฌ๋์ด์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ํ๋ฒ๋ง ์ฐธ์กฐํ๋ฉด ๋์ง๋ง, ์๋๋ผ๋ฉด ์๋ค๋ก ๋ถํ ๋์ด ์๋๊ณณ์ ๋๋ฒ ์ฐธ์กฐํด์ผํ ์๋ ์์
- x86-64๋ ๋ฐ์ดํฐ์ ์ ๋ ฌ์ ๊ด๊ณ์์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ์ง๋ง, ์ธํ ์ ๋ฉ๋ชจ๋ฆฌ ์์คํ ์ฑ๋ฅ ํฅ์์ ์ํด ์ ๋ ฌํ ๊ฒ์ ๊ถ๊ณ ํ๊ณ ์์
- ์ ๋ ฌ ๊ถ์ฅ์ฌํญ์ ๋ค์๊ณผ ๊ฐ๋ค
- K = 1 : char
- K = 2 : short
- K = 4 : int, float
- K = 8 : long, double, char *
- ์ํ, ์ด๊ฒ bool ์ ์ ๋ฐฐ์ด๋ณด๋ค bitset์ด ๋น ๋ฅธ ์ด์ ๊ตฌ๋!! ์์์ SIMD๋ฅผ ์ง์ํ๋ฉด์ ์ฑ์์ฃผ๋๊ฑฐ๊ตฌ๋!!
- ๊ทธ๋ฆฌ๊ณ ์ด๊ฑธ ํจ๋ฉ์ด๋ผ๊ณ ํ๊ฒ ๊ตฌ๋!
.align 8- ์ด์ ๋ธ๋ฆฌ์์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์์ผ๋ฉด, ๊ทธ ๋ค๋ฐ๋ฅด๋ ๋ฐ์ดํฐ๊ฐ 8์ ๋ฐฐ์์ ์ฃผ์๋ก ์์๋ ๊ฒ์ ๋ณด์ฅํ๋ค.
struct S1 { int i; char c; int j; }- ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด, 4 / 1 / 4 ๋ฐ์ดํธ๋ฅผ ์ฐ๋๊ฒ ์๋๋ผ 4 / 1 + 3(ํจ๋ฉ) / 4 ๋ฐ์ดํธ๋ฅผ ์ด๋ค.
- ๊ฒฐ๊ณผ์ ์ผ๋ก j๋ ์คํ์ 8์ ๊ฐ์ง๋ฉฐ ์ ์ฒด ๊ตฌ์กฐ ํฌ๊ธฐ๋ 12๋ฐ์ดํธ์ด๋ค.
- ๋ํ, ์ปดํ์ผ๋ฌ๋ S1 ์ ํ์ ํฌ์ธํฐ p๊ฐ 4๋ฐ์ดํธ ์ ๋ ฌ์ ๋ง์กฑํ๋์ง ํ์ธํด์ผํ๋ค.
- ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด, 4 / 1 / 4 ๋ฐ์ดํธ๋ฅผ ์ฐ๋๊ฒ ์๋๋ผ 4 / 1 + 3(ํจ๋ฉ) / 4 ๋ฐ์ดํธ๋ฅผ ์ด๋ค.
- ์ผ๋ถ ๊ฐ์ฒด๋ค์ ๋ํ ์ฃผ์๋ 2, 4, 8๋ฑ์ ๋ฐฐ์์ฌ์ผํจ์ ์๊ตฌํ๋ ์ ๋ค์ด ์๋ค
โ์ง๋ฌธ ์ฌํญ#
- ์ผ๋ถ ๊ฐ์ฒด๋ค์ ๋ํ ์ฃผ์๋ 2, 4, 8๋ฑ์ ๋ฐฐ์์ฌ์ผํจ์ ์๊ตฌํ๋ ์ ๋ค์ด ์๊ณ , ์ด๋์ผ ํ๋์จ์ด ์ค๊ณ๊ฐ ๋จ์ํ๋๋ค
- ํ๋์จ์ด ์ค๊ณ๊ฐ ๋จ์ํ๋๋ค๋๊ฑด ๋ญ๊น?
- ๋ํ, ์ปดํ์ผ๋ฌ๋ S1 ์ ํ์ ํฌ์ธํฐ p๊ฐ 4๋ฐ์ดํธ ์ ๋ ฌ์ ๋ง์กฑํ๋์ง ํ์ธํด์ผํ๋ค.
- ์์ ์๋ ์์๋ค ์ค K์ ์ต๋๊ฐ์ ๊ธฐ์ค์ผ๋ก ํ๋?
๐ ์ฐธ๊ณ ์๋ฃ#
- CSAPP
