์ฒ์์ ์ธ๋ผ์ธํ๋์ ๊ทธ๋ฐ์ค ์์๋ค ํ์ง๋ง ์ง์ ํ์ธํด๋ณด์๊ณ ์๊ฐํด์ ํ์ธํด๋ณด์๋ค
์ฐธ๊ณ ๋ก ์ต์ ํ๋ ๊ป๋ค
์ผ๋จ ๋์ถฉ ์ด๋ ๊ฒ ํ๋ค
๋ฉ์ธ๋ถ๋ถ์ ๋จผ์ ๋ณด์๋ฉดย
nullptr์ ๋ฃ๊ณ ๊ทธ๋ฅ ์ธ์์ this๋ฅผ ๋ฃ๊ณ ๊ทธ๋ฅ test::a๋ฅผ ํธ์ถํ๋ค
๊ทธ๋ฆฌ๊ณ test::a์์ this๋ฅผ ๋ฐ๊ณ ๋ฐ์ดํฐ์์ญ์์ ํ
์คํธ๋ฅผ ๊ฐ์ ธ์ ๊ทธ๋ฅ ์ถ๋ ฅํ๋ค
๊ฒฐ๋ก ์ ๋น์ฐํ๊ฒ this๋ฅผ ์ฐธ์กฐํ์ง ์์ผ๋ ์ด๋ก ์ ํธ์ถ์ ๊ฐ๋ฅํ๊ฑฐ๋ค
๋๋ ์์งํ ์ด๊ฑด ide๋จ์์ ๋งํ๋์ค ์๊ณ ๋น์ฐํ ์ธ๋ผ์ธํ๋๋ณด๋ค ํ๋ค ๊ทธ๋ฆฌ๊ณ ๊ทธ๋์ผ ๋ง๋๊ฑฐ ๊ฐ์ง๋ง ์๋ง๋๊ฒ ์ข ๊ทธ๋ ๋ค
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์๊ฐํ ๊ฑด ์ ์ฌ์ง์ x86/64๊ธฐ์ค์ด๊ณ gcc๊ธฐ์ค์ด๋ค ๊ทผ๋ฐ ํจ์ํธ์ถ์ ๋๋ง ๋ค๋ฅด๊ณ ๋๋จธ์ง๋ ๋น์ทํ๊ธฐ ๋๋ฌธ์ ํฌ๊ฒ ์๊ด์ ์์๊ฑฐ๊ฐ๋ค
+๊ทธ๋ฆฌ๊ณ ๋ณด๋ฉด์ ์ฒ์์์๋๋ฐ ์ปค๋์ชฝ ํจ์๋ 32๋นํธ์ธ๊ฑฐ ๊ฐ๋ค
- dc official App
'์ญ์ ํ๋จธ๋ ๋ฌ๋ผ' ์ฝ
๋ ์ง์คํฐ์ this๋ฃ๋ ๋ถ๋ถ์ด ์ด๋์์?
2๋ฒ์งธ 3๋ฒ์งธ ์ค์ ๋๋ค - dc App
mov์ฐ์ฐ๋งํ๋๊ฑฐ?
๋ง์ต๋๋ค - dc App
์ฒซ์ค mov์ฐ์ฐ์ผ๋ก t์๋ค๊ฐ 0๋ฃ๊ณ ๋์งธ์ค์์ ๊ทธ ๊ฐ์ rax์ ๋ฃ๊ณ ์ ์งธ์์ rdi์ ๋ฃ๋๊ฑฐ ์๋?
๋ง์ต๋๋ค - dc App
๊ทผ๋ฐ ๊ทธ๊ฒ ์ this๊ฐ์?
์ this์์ฒด๊ฐ null๊ฐ์ด๋ผ this๊ฐ์ด๋ผ๊ณ ๋งํ๊ฑฐ๊ตฌ๋ ์ดํดํ์ด..
t๋ ์คํ์ ์์ง๋ง t๊ฐ์ ํ์ ๊ฐ๋ฅดํต๋๋ค - dc App
์๋์์ t๊ฐ์ด this์์ - dc App
์ข ์ดํด๊ฐ ์๊ฐ๋๋ฐ, t๊ฐ์ด ์ this์?
t์๋ค๊ฐ ํ ๋น๋์ํ๋๋ฐ ์ด๋ป๊ฒ ํ์ ๊ฐ๋ฆฌํค๋๊ฑฐ๊ณ
t์์ฒด๋ง๊ณ t๊ฐ ๊ฐ์ง๊ณ ์๋ โ๊ฐโ์ด(t์์ฒด๋ ๊ทธ๋ฅ ์คํ์ ์กํํฌ์ธํฐ์์)t์ฃผ์์์ - dc App
๊ทธ๋์ ๋งํ์์ต๋๋ค ide๋จ์์ ๋ง์์ผ๋๋ค๊ณ ์ ๊ฑด this์ฐธ์กฐ๊ฐ ์์ด์ ๊ทธ๋ฐ๊ฑฐ์ง ์๋์์ผ๋ฉด ๋ปฃ์ด์ผ ์ ์์ด์์ - dc App
๋ณด์๋ค์ํผ 0์ ๊ฐ๋ฅดํค๊ณ ์์ด์ - dc App
๊ทธ๋ฌ๋๊น t ์์ฒด๋ ์คํ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ๋ ๊ฑฐ๊ณ ๊ทธ๊ฒ ์ด์ ๋ธ๋ฆฌ์์ PTR[rbp-8]์ด์์. ์ ์ด์ ํฌ์ธํฐ ๋ณ์๊ฐ ํ ๋น๋์๋๋ฐ "t๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฐ"์ด๋ผ๋ ๋ถ๋ถ์ด ์ดํด๊ฐ ์๊ฐ๋๋ฐ
ํฌ์ธํฐ์ ๊ณต๊ฐํ ๋นํ๊ฒ๋์๋๊ณ ์ด๋ ์ฃผ์ ๊ฐ๋ฆฌํจ๊ฒ๋์๋๋ฐ
ํ๋ฒ ์ ๊ฐ ๋งํ๊ฒ๋ค์ ์กฐํฉํด๋ณด์๊ณ ์๊ฐํด๋ณด์ธ์ - dc App
๊ณ์ ๋งํ์ง๋ง ide๋จ์์ ๋ง์์ผ๋๋ค๊ณ ์๊ฐํ๋ค๊ณ ์๊ฐํด์ - dc App
๋ ์ง์ง ์ดํด๊ฐ ์๊ฐ๋๋ฐ t๊ฐ ๊ฐ๊ณ ์๋๊ฐ์ null๊ฐ(์ด์ ๋ธ๋ฆฌ์์ 0)์์.
์๋ ide๋จ์์ ๋ง์์ผํ๋๊ฑฐ์ผ ๋น์ฐํ๊ฑฐ๊ณ ๋ ๋์ ์ค๋ช ์์ "๋ ์ง์คํฐ์ this๋ฅผ ๋ฃ๊ณ "๋ถ๋ถ์ด ์ดํด๊ฐ ์๊ฐ์ ๋ฌผ์ด๋ณธ๊ฑฐ์
Mainํจ์๋ ์ ๋ ๊ฒ ๋์์ง๋ง aํจ์๋ this๊ฐ ๋ญ๊ฐ ๋ค์ด์ฌ์ง ๋ชฐ๋ผ์ ๊ทธ๋์ ์คํ์ ๊ฐ๋ฅํ๊ฑฐ์์ ์๋๋ฉด this๋ฅผ ์ฐธ์กฐํ๋๊ฒ ์๊ฑฐ๋ ์ ๊ทธ๋์ ๊ฐ๋ฅํ๊ฒ๋๋ค - dc App
์๊น๋ ๋งํ์ง๋ง t๊ฐ์ด this์ ๋๋ค t๋ 0์ ๊ฐ๋ฅดํค๋๊ฑฐ ๋ฟ์ด์ฃ ํจ์์์ ์ฐธ์กฐํ๋ค๋ฉด ๋ปฃ์์๊ฒ๋๋ค - dc App
์ดํด๊ฐ ๋์ จ์๊น์ - dc App
ํน์ c++ ๋ฉค๋ฒํจ์ ํธ์ถํ ๋ ์ด์ ๋ธ๋ฆฌ๋ก ๋ณํ๋์์๋ rdi์ this๊ฐ์ด ๋ค์ด๊ฐ?
๊ทธ๊ฑฐ๋ ํธ์ถ๊ท์ฝ๋ง๋ค ๋ค๋ฆ ๋๋ค - dc App
stdcall์ผ๋
๊ทธ๋ ์ฃ 64๋ ์ธ์๋ ๋ ์ง์คํฐ๋ฅผ ์๋๋ค - dc App
ใ ใ ๊ทธ๋ผ ๋ด๊ฐ ํธ์ถ๊ท์ฝ ๊ด๋ จํด์ ์๊ฐ๋ชปํด์ ๋ญ์ค๋ช ์ธ์ง ๋ชฐ๋๋๋ฏ
c์ธ์ดํ ๋๋ง ๋์ค์ด์ ๋ธ๋ฆฌ์ผ์ ๋ดค์ด๊ฐ์ง๊ณ .. ๋ฏธ์ํฉ๋๋ค
์ข์ต๋๋ค mavc๋ง๊ณ ๋ ๋ค๋ฅธ ์ปดํ์ผ๋ฌ๋ ๋ณด์ฌ์ฃผ๋
https://godbolt.org/
์ด๊ฑธ
์จ๋ณด์ธ์ - dc App
๊ทผ๋ฐ ์๊ฐํด๋ณด๋ ide๋จ์์ ๋ง๊ธฐ ํ๋ค์ง์์? ์ง๊ธ์ด์ผ ๋ฉ์ธํจ์์์ ๋๊ฐ ๋ฃ์๋ง์ ํจ์ํธ์ถํ๊ฑฐ์ง๋ง ์ด๋ค ํจ์์์ ํ๋ผ๋ฏธํฐ๋ก ํฌ์ธํฐ๊ฐ ๋ค์ด์๋ค๊ณ ํ๋ฉด ๊ทธ ๊ฐ์ด ๋ญ์ค์๊ณ ๋ง๋์ถ์๋ฐ
์ฌ๊ทํจ์๋ ๋ถ๋ถ ์ธ๋ผ์ธํํ๋ ๊ทธ๋ค์ ๋๋ค ๊ณผ์ํ๊ฐํ์ง ๋ง์ธ์ - dc App
๋ฐํ์์ผ๋ ๊ฐ์ด ๊ฒฐ์ ๋๋๋ฐ ์ด๋ป๊ฒ ์์๋
๋ฐํ์์ ๊ฒฐ์ ๋๋ ํ๋ผ๋ฉด ํ ์์์ฃ ์ด๊ธฐํ๋์ง ์๋ ๋ณ์๊ฐ ์กด์ฌํ๋ค๋ ๊ฒฝ๊ณ ์ฒ๋ผ ๋ฏธ๋ฆฌ ํ ์ด๋ธ ๋ง๋ค์ด๋ณด๊ณ ํ๋ํ๋ ๋ฐ์ง๋ฉด ๋๊ธดํ ๊ฒ๋๋ค - dc App
๊ทธ๊ฒ ์๋๋ฉด c++ ๋์์ธ์ฒ ํ์ด๋ผ๊ณ ์ฐ๊ธธ์๋ ์๊ฒ ๋ค์ ์์ ๋ ์ค๋ค๋ ์์ผ๋ก - dc App
ํ๊ธด ์๊ฐํด๋ณด๋ ์ค์ฝํ๋ด์ ์ ์ธํ ๊ฒ๋ค์ค ํ ๋น ํ๋ฒ๋ ์ํ๋ค๋ฉด ๊ทธ์ ๋๋ ๊ฐ๋ฅํ ๋ฏ..
๊ทผ๋ฐ ๊ทธ๋ฌ๋ฉด os ๋ง๋ค๋ ํ๋ค๊ฒ๊ฐ๊ธดํ๋ด
ํธ์์?
์ฐธ์กฐ์ฉ ํฌ์ธํฐ์ ์ธ์คํด์ค๊ฐ ํ ๋น์ด ์๋์ด์์ด๋ ํจ์๋ด์ฉ์ด ํ๋๋ ์๊ด ์๋ ์ธ๋ผ์ธํจ์๋ก ๊ฐ๋ฅํ๊ฒ ๋์ด์์ผ๋ฉด ์ฐธ์กฐ์ฉ ํฌ์ธํฐ์์ ํธ์ถ์ ๊ฐ๋ฅํ๋ค... ์ ๊ธฐํ๋ค
์ ์์ค์์ ๋ณด๋ฉด ๋ค ์๋ฏธ๊ฐ ์๋๊ฑฐ์ฃ - dc App
c++๋ง ๊ทธ๋ฐ๊ฑด์ง ๋ค๋ฅธ ์ธ์ด๋ ๊ทธ๋ฐ๊ฑด์ง ๊ถ๊ธํจ
C#์ ์ปดํ์ผ์ต์ ํ๋ฅผ ๊บผ๋ ๊ทธ๋ฅ ์ธ๋ผ์ธ ์ํค๋ค์ - dc App
๊ทธ๋ฆฌ๊ณ ์ปดํ์ผ๋ฌ๊ฐ ์๋ง๋๋ค๋ฉด abi๊ฐ ๋์ผํด์ผ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ ํ๋ซํผ์์ ์๊ฒฐ๊ณผ๋ ๊ฐ์๊ฒ๋๋ค - dc App
๋๋ฌด ๋ฅํ๊ฒ ์ ๊ทผํ๋ค..๊ฒ์๊ฐ๋ฐ ์ด๊ฑฐ ๋ง๊ณ ๋ ํ ๊ฒ ๋ง๋ค...๊ทธ๋ฅ ๋์ด๊ฐ
๋ฅํ์ง ์์๊ฑฐ ๊ฐ์ต๋๋ค ์๋ ๋์ค์ด์ ๋ธ๋ฆฌ๋ณด๋ฉด์ ์ฝ์คํ ์ถ์ ํ๋๊ฒ ์ฌ๋ฏธ๊ฑฐ๋ ์ - dc App
๊ทธ๋ฆฌ๊ณ ์ด๊ฑด ์ข๋ง ๊ณต๋ถํ๋จ ๋ณผ์์๋ ์์ค์ ๋๋ค - dc App
C++ ๋ง ์์ํ ๋ด๋น๋ฐ ๋ด๊ฐ ์ดํดํ๊ฒ ๋ง๋์ง ๋ฌผ์ด๋ด๋ ๋ ๊น? ์ง๊ธ ํ ์คํธ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํค๋ ํฌ์ธํฐ๋ฅผ ๋ํฌ์ธํฐ๋ก ์ ์ธํ๊ณ , ๊ฐ์ฒด๋ ์๋ง๋ค๊ณ ๊ทธ ๋ ํฌ์ธํฐ๋ก ํด๋์ค ํจ์๋ฅผ ๋ถ๋ฌ์๋๋ฐ ๋ฌธ์ ๊ฐ ์๋ค๋๊ฑฐ ๋ง์?ใทใท ์ธ๋ผ์ธ ํ ๊ฒ๋ ์๋๊ณ ๊ทธ๋ฅ t->a() ๊ฐ ํจ์ ํฌ์ธํฐ์ฒ๋ผ ์๋ํ๊ฑฐ์ง? ์ ๊ธฐํ๋คใทใท ๋งค๊ฐ๋ณ์๊ฐ ์์๋๋ ํจ์๋ถํฐ ๋ถ๋ฅด๊ณ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฅด๋ ค๋?
์ธ์๋ ์คํ์ ์๋๋ค(์ ์ฌ์ง์์ ๋ ์ง์คํฐ) ๊ทธ๋์ ์ธ์๊ฐ ์์ด๋ ๋งด๋ฒํจ์๋ ๋งด๋ฒ ๋ณ์์ ์ ๊ทผํ์ง ์๋ ์ด์ ๊ด์ฐฎ์๊ฑฐ ๊ฐ๋ค์ - dc App
์ค ๊ฐ์ฌํฉ๋๋คใ ๊ทผ๋ฐ ํ ์คํธ ํด๋์ค์ b() ๋ฅผ ๋ง๋ค๊ณ a()์์ b๋ฅผ ๋ถ๋ฌ๋ ์๋ ํ๋๊ฑฐ ์๋๊ฐ์? ๋งด๋ฒ ๋ณ์์๋ง ์ ๊ทผ ์ํ๋ฉด ๋๋๊ฒ ์๋์ง??
๊ทธ ํจ์๊ฐ ๋งด๋ฒ๋ณ์๋ฅผ ์ ๊ทผํ ์์์ผ๋ ์๋ถ๋ฅด๋๊ฒ ์ข์ฃ ์ ํจ์๋ ๊ทธ๋ฅ ๋ฉํฌ๋ก๋ก ๋ฐ์๋ ์ด์ํ์ง ์์ ์ฝ๋๋ ๋๋๊ฒ์ด๊ณ ์ - dc App
int main() { test::a(); }
Test* this = nullptr; test::a(this); ์ด๊ฒ ๋ง๋ ํํ์ ๋๋ค - dc App
static ์ ์ธ ์ํ๋๋ ๊ฐ์ฒด ์์ด ์ ๊ทผ ํ ์ ์๋์?
์์ ์ค๋ช ์์ต๋๋ค - dc App
์ ์๋ ๊ฒฐ๊ตญ ์ธ๋ผ์ธํ ๋๊ธดํ๊ฑด๊ฐ์? ์ ์ธ๊ณผ๋์์ ์ ์๊น์ง ๋ค์ป์ผ๋๊น ์ธ๋ผ์ธ์ด๋๊ธฐ๋ํ๊ฑด๊ฐ
์ธ๋ผ์ธ์ ์๋์์ ๋ณด์๋ค์ํผ this๋ฅผ ์ธ์์ ๋ฃ์ต๋๋ค ๊ทผ๋ฐ ์๋ง ์ต์ ํ๋ฅผ ํค๋ฉด ์ธ๋ผ์ธ๋ ๊ฒ๋๋ค - dc App
ํจ์ ํธ์ถ์ด ๋ฌธ์ ๋ ๊ฑด ์์ง ์ด์ฐจํผ ํจ์๋ ์ฝ๋ ์์ญ์ ์์ผ๋, ๋์ด ๋งํ๋๋ก ๋ฌธ์ ๋ this ์ ์ ๊ทผํ๋ ค๋๋ฐ ๊ทธ๊ฒ null ์ผ ๋ ๋ฌธ์ ๊ฐ ์๊ธฐ๋๊ฑฐ๊ณ ๊ทผ๋ฐ ๋ ํจ์๋ this ์ ์ ๊ทผ์ ์ํ๋ ๋ฌธ์ ๊ฐ ์๋๊ฑฐ์ง ์ด๊ฒ ์ ์ปดํ์ผ๋ฌ ๋จ์์ ๋ง์์ผ๋๋จ๊ฑฐ์??
C#์ผ๋ก ๋ณด๋ฉด ๋งด๋ฒ๊ฐ ํฌ์ธํฐ์ผ๋๋ ๋น์ทํ ์์ธ์ด๋ผ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค - dc App
๋ง์ํ์ ๊ฑฐ์ฒ๋ผ ์ ์์ค์์ ๋ฌธ์ ์์ด์ - dc App
๊ทธ๋ฆฌ๊ณ ์ปดํ์ผ๋ฌ์์ ๋ง์์ผ๋๋ค๊ณ ํ์ ์ ์์ต๋๋ค - dc App