πŸ˜­μ€‘μš”! thiscall 호좜 κ·œμ•½μ— λŒ€ν•΄ 멀버 ν•¨μˆ˜μ˜ 호좜 원리_μ½”λ“œ μ˜μ—­μ— λŒ€ν•΄

보물창고·2022λ…„ 8μ›” 26일
0

c++Intermediate μ½”λ“œλˆ„λ¦¬

λͺ©λ‘ 보기
1/62

240725

: ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” κ·œμ•½μ΄λΌλŠ” 것이 μžˆλ‹€.
cdecl , stdcall , thiscall 이 μžˆλŠ”λ°
클래슀의 λ©€λ²„ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν• λ•Œ ,
thiscall 을 μ‚¬μš©ν•œλ‹€.

λ‚˜λ¨Έμ§€λŠ” 넀이버 λΈ”λ‘œκ·Έλ‘œ κ³ κ³ κ³ !!

클래슀의 λ©€λ²„ν•¨μˆ˜

μ €μž₯λ˜λŠ” λ©”λͺ¨λ¦¬ μœ„μΉ˜

클래슀의 λ©€λ²„ν•¨μˆ˜λŠ” μ½”λ“œ μ˜μ—­μ— μ €μž₯됨.
객체 μƒμ„±μ‹œ ν• λ‹Ήλ˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ— μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
멀버 ν•¨μˆ˜λŠ” μ½”λ“œ μ˜μ—­μ— 있고, ν˜ΈμΆœμ‹œ, ν•΄λ‹Ή 객체의 this 포인터가 μ „λ‹¬λ˜λ©΄μ„œ ν˜ΈμΆœλœλ‹€.
즉 , 객체와 μ†ν•΄μžˆμ§€λ§Œ, μ½”λ“œ μ˜μ—­μ— 단 ν•˜λ‚˜λ§Œ λ§Œλ“€μ–΄μ§„λ‹€.

μ½”λ“œ μ˜μ—­μ΄λž€?
-> 넀이버 λΈ”λ‘œκ·Έ wsp의 code / text μ–΄μ…ˆλΈ”λŸ¬ μ €μž₯을 μƒκ°ν•˜μž.
ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰ν•  μ½”λ“œμ™€ 맀크둜 μƒμˆ˜κ°€ 기계어 ν˜•νƒœλ‘œ μ €μž₯λ˜λŠ” 곡간.
ν”„λ‘œκ·Έλž¨μ΄ μ‹œμž‘ν•˜κ³ , μ’…λ£Œλ  λ•ŒκΉŒμ§€ λ©”λͺ¨λ¦¬μ— 계속 남아 있음.
컴파일 νƒ€μž„μ— κ²°μ •λ˜κ³ , 쀑간에 μ½”λ“œ 변경이 λΆˆκ°€ν•˜κ²Œ
read only둜 λ˜μ–΄ 있음.

  • 멀버 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  경우, 객체의 μ£Όμ†Œκ°€ 첫번째 인자둜 전달됨.

class Point
{
public :
void Set(Point* this, int _x, int _y)
{
this->x = _x;
this->y = _y;
}
}
-> 호좜 μ‹œ μ‹€μ œλ‘œλŠ” 이런 ν˜•νƒœλ‘œ 호좜됨.
Set(&객체λͺ…, , );

this Call

: this포인터λ₯Ό μ΄μš©ν•΄ 클래슀의 λ©€λ²„ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 과정을 말함.

  • 클래슀의 λ©€λ²„ν•¨μˆ˜λŠ” 객체가 λ‹€λ₯΄λ”라도 μ½”λ“œ μ˜μ—­μ— ν•˜λ‚˜λ§Œ λ§Œλ“€μ–΄ 진닀.
    κ·Έλž˜μ„œ ν•΄λ‹Ή κ°μ²΄λ§ˆλ‹€ λ©€λ²„ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄μ„œλŠ” 객체의 λ©”λͺ¨λ¦¬λ₯Ό λ„˜κ²¨μ€˜μ•Ό ν•œλ‹€. 이λ₯Ό this call 이라고 ν•œλ‹€.

problem

: Point ν΄λž˜μŠ€μ™€ set ν•¨μˆ˜λ₯Ό λ§Œλ“€κ³ , μ–΄μ…ˆλΈ”λŸ¬λ₯Ό 톡해 set ν˜ΈμΆœν•˜λŠ” 과정을
ν™•μΈν•˜λΌ.

  • μ–΄μ…ˆλΈ”λŸ¬λ‘œ setν˜ΈμΆœν•˜λŠ” κ³Όμ • ν‘œν˜„
    : p1.set(10,20);

μ—¬κΈ° μ€‘μš”!

push 20
push 10
mov ecx &p1 //λ§ˆμ†Œμ—μ„œλŠ” lea둜 μ‚¬μš©ν•˜κ³  μžˆμŒμ„ 확인할 수 있음.
call Point::set
  • μ•„λž˜ 그림을 보면, λ§€κ°œλ³€μˆ˜λ‘œ thisλ₯Ό 넣어주지 μ•Šμ•˜λŠ”λ°, Set λ‚΄λΆ€ μ½”λ“œμ—μ„œλŠ” this 포인터가 mov λ˜λŠ” 것을 확인할 수 있음.
    -> μ–΄μ…ˆλΈ”λŸ¬μ˜ movλŠ” λŒ€μž…μ΄λ‹€.

κ²°λ‘ 

: 객체의 λ©€λ²„λ°μ΄ν„°λŠ” this 포인터λ₯Ό μ΄μš©ν•΄ μ ‘κ·Όν•˜λŠ” 것을 확인할 수 있음.


static λ©€λ²„ν•¨μˆ˜

staticμ—μ„œ 멀버 접근이 μ•ˆλ˜λŠ” 이유

:
static λ©€λ²„ν•¨μˆ˜λŠ” Data μ˜μ—­μ— 속함.
static λ©€λ²„ν•¨μˆ˜λŠ” λ‚΄λΆ€μ μœΌλ‘œ thisμΈμžκ°€ μ—†μŒ.
thiscall 이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή 객체의 멀버 데이터와 ν•¨μˆ˜λ‘œ 접근이 λΆˆκ°€ν•¨.

μ™œλƒν•˜λ©΄, 객체 λ‚΄μ˜ λ©€λ²„λ°μ΄ν„°λŠ” this 포인터λ₯Ό ν†΅ν•΄μ„œλ§Œ 접근이 κ°€λŠ₯ν•˜λ―€λ‘œ.

  • μ•„λž˜ μ½”λ“œλ₯Ό 보면, Point 의 멀버데이터 μ ‘κ·Ό λͺ»ν•˜κ³  μžˆλŠ” 것을 확인할 수 있음.

  • μ–΄μ…ˆλΈ”λŸ¬λ₯Ό 확인해보면, this 포인터가 μ‚¬μš©λ˜κ³  μžˆμ§€ μ•ŠμŒ. 을 확인할 수 있음.

profile
πŸ”₯πŸ”₯πŸ”₯

0개의 λŒ“κΈ€