ํด๋์ค์ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
ํด๋์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ค๋ ๊ฒ์ ๊ฒฐ๊ตญ CPU์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ ๊ตํ์ผ๋ก ํ์๋ ์ ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ํ๋ก๊ทธ๋จ ์ฝ๋๋ฅผ ๊ฐ์ ธ์์ CPU๊ฐ ์คํํ๊ณ ์คํ ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ๋ด์ฉ์ ์ฝ๊ฑฐ๋ ์๋ก์ด ๋ด์ฉ์ ์ฐ๋ ๊ฒ์ด ๊ฑฐ์ ์ ๋ถ๋ผ๊ณ ํ ์ ์์ต๋๋ค. ๊ฒฐ๊ตญ ํ๋ก๊ทธ๋๋ฐ์ ํ๋๋ฐ ์์ด์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ค์ํ๋ค๋ ๋ง์ ๋๋ค.
class CTest
{
public:
char m_Char;
int m_Int;
double m_Double;
static int m_SInt;
int MemberFunc()
{
return m_Int;
}
};
์ ํด๋์ค CTest์ ์ ์ ๋ฉค๋ฒ ๋ณ์ m_SInt์ ๋ฉค๋ฒ ํจ์ MemberFunc๋ CTest t ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํฌํจ๋์ด ์์ง ์์ต๋๋ค.
์ผ๋ฐ ๋ฉค๋ฒ๋ณ์๋ ๊ฐ์ฒด๋ง๋ค ์กด์ฌํ์ง๋ง ์ ์ ๋ฉค๋ฒ ๋ณ์๋ ์ค์ง ํ๋๋ง ์กด์ฌํฉ๋๋ค.(m_SInt๋ ์ ์ญ๋ณ์๊ฐ ์ ์ฅ๋๋ ์ ์ญ ๋ฐ์ดํฐ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ 4๋ฐ์ดํธ๋งํผ ํ๋๋ง ์กด์ฌํ๋ค.) ๋ฉค๋ฒ ํจ์๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ ํจ์๋ค์ ์ผ์ฐ๊ฐ์น ๋ฉ๋ชจ๋ฆฌ ์ฝ๋ ์์ญ์ ์์นํฉ๋๋ค.
ํด๋์ค๊ฐ ์ ์๋๋ฉด ํด๋์ค์ ์ผ๋ฐ ๋ฉค๋ฒ ๋ณ์๋ ํด๋น ๋ณ์๊ฐ ํด๋์ค์ ๋ฉ๋ชจ๋ฆฌ ์์ ์์น์์ ์ผ๋ง๋ ๋จ์ด์ ธ์ ์์นํ๊ฒ ๋๋์ง๋ฅผ ๋ํ๋ด๋ ์คํ์ ์ ๋ณด๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.(์คํ์ ์ ๋ณด๋ ์ปดํ์ผ๋ฌ์ ์ํด์ ๊ธฐ์ต๋ฉ๋๋ค.)
์ฆ, CTest๋ฅผ ์ดํด๋ณผ ๋ (m_Char, 0), (m_Int, 1), (m_Double, 5)๋ผ๋ ์ ๋ณด๋ฅผ ์ปดํ์ผ๋ฌ๊ฐ ๊ธฐ์ตํฉ๋๋ค.
void PrintOffset()
{
int OffsetC = (int)(&(((CTest*)0)->m_Char));
int OffsetI = (int)(&(((CTest*)0)->m_Int));
int OffsetD = (int)(&(((CTest*)0)->m_Double));
}
์์ํ ์ ์์ผ๋ ๊ธฐ๋ณธ์ ์ธ ์ฒ๋ฆฌ ๋ฐฉ์์ 0์ CTest* ํ์ ์ผ๋ก ๋ณํํ์ฌ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฃผ์๋ฅผ 0์ผ๋ก ๋ง์ถ๊ณ ๊ฐ ๋ฉค๋ฒ์ ์ฃผ์๋ฅผ ์ป์ด๋ด์ ์คํ์ ์ ๊ตฌํ๋ ๊ฒ์ ๋๋ค.
๊ธฐ๋ํ๋ [0, 1, 5]์๋ ๋ฌ๋ฆฌ [0, 4, 8]์ด ๋์ต๋๋ค. ์ด๋ ์ปดํ์ผ๋ฌ์ ์ ์ ํ ์กฐ์น๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฉค๋ฒ ๋ณ์๋ ์คํ์ ์ด ๋ณ์ ํ์ ํฌ๊ธฐ์ ๋ฐฐ์์ผ ๋ CPU์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํ์๊ฐ ์ต์ํ๋์ด ์ต์ ์ ์ฑ๋ฅ์ ๋ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฐ ์์ผ๋ก ๋ฐฐ์น๋ฅผ ํ๋ฉด ๋ญ๋น๋๋ ๋น ๊ณต๊ฐ์ด ์๊ธฐ๊ฒ ๋๋ฉฐ(๋ด๋ถ ๋ฉ๋ชจ๋ฆฌ ๋จํธํ) ๋ณ์ ํ์ ์ ํฌ๊ธฐ์ ํฌ๊ธฐ๊ฐ ๋๋ฌด ํด ๊ฒฝ์ฐ ๋ญ๋น๋๋ ๊ณต๊ฐ๋ ์ปค์ง๋ ๋ฌธ์ ๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฅํ๋ฉด ์คํ์ ์ด ํ์ ํฌ๊ธฐ์ ๋ฐฐ์๊ฐ ๋๋๋ก ์ค์ ์ ํ์ง๋ง ๋๋ฌด ์ปค์ง์ง ์๋๋ก ์ต๋๊ฐ์ ๋ก๋๋ค.
์๋์ฐ์ ๊ฒฝ์ฐ Visual C++์ [๊ตฌ์ฑ์์ฑ > C/C++ / ์ฝ๋ ์์ฑ / ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ ๋ง์ถค]์์ ํ์ธ ํ ์ ์๋๋ฐ, /Zp8 ์ต์ ์ด ๊ธฐ๋ณธ์ผ๋ก ์กํ์์ต๋๋ค.๋ง์ฝ /Zp2 ์ต์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ [0, 2, 6]์ด ๋์ค๊ณ , Zp1 ์ต์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ [0, 1, 5]๊ฐ ๋์ต๋๋ค.
ํด๋์ค์ ํฌ๊ธฐ
ํด๋์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์น๋์๋ค๋ ๊ฒ์ ์ผ์ ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฐจ์งํ๋ค๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ํด๋์ค์ ํฌ๊ธฐ๋ sizeof๋ก ์ ์ ์์ต๋๋ค.
๋ค๋ง, ๋ฉค๋ฒ๋ณ์๊ฐ ์๋ ํด๋์ค๋ size๊ฐ 0์ด๋ผ๊ณ ์๊ฐํ ์๋ ์๋๋ฐ, ์ด๋ ํด๋์ค ์์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋๋ ์ฐจ์งํ์ง ์๋ ๋ค๋ ๋ง๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฆฝ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ปดํ์ผ๋ฌ๋ ๋ฉค๋ฒ๋ณ์๊ฐ ์๋ ํด๋์ค์ ๋ํด ๊ธฐ๋ณธ์ ์ผ๋ก 1Byte ํฌ๊ธฐ์ ๋ฉค๋ฒ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๋ํ ํด๋์ค์ ๊ฐ์ ํจ์๊ฐ ํ๋๋ผ๋ ์กด์ฌํ ๊ฒฝ์ฐ(๊ฐ์ ์๋ฉธ์๋ ๋ง์ฐฌ๊ฐ์ง) ๊ฐ์ํจ์๋ฅผ ์ํ ๊ฐ์ ํจ์ ํ ์ด๋ธ์ด ์์ฑ๋๊ณ ํด๋์ค์๋ ํด๋น ํ ์ด๋ธ์ ๊ฐ๋ฆฌํค๋ vfptr์ด๋ผ๋ ๊ฐ์ ํจ์ ํ ์ด๋ธ ํฌ์ธํฐ๊ฐ ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ํจ์๋ฅผ ๊ฐ์ง ํด๋์ค์ size๋ ์์คํ ์ ๋ฐ๋ผ์ 4๋ฐ์ดํธ ํน์ 8๋ฐ์ดํธ๊ฐ ๋ฉ๋๋ค.
์ถ์ฒ: Fundamental C++, ์ดํ์