๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/C++ ์‘์šฉ

ํด๋ž˜์Šค์˜ ํฌ๊ธฐ์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

by ์„œ์•„๋ž‘๐Ÿ˜ 2023. 9. 14.

 

 

 

ํด๋ž˜์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์€ ๊ฒฐ๊ตญ 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++, ์ดํ™”์ˆ˜

 

๋Œ“๊ธ€