πŸ’˜ C++/ν•¨μˆ˜

인라인 ν•¨μˆ˜ (Inline Functions)

Hyonii 2022. 7. 31. 16:12

인라인 ν•¨μˆ˜ (Inline Functions)

ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같은 λ§Žμ€ 이점을 얻을 수 μžˆλ‹€.

 

  • ν•¨μˆ˜ λ‚΄λΆ€μ˜ μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•  수 μžˆλ‹€.
  • μΈμŠ€ν„΄νŠΈ μ½”λ“œλ³΄λ‹€ ν•¨μˆ˜μ—μ„œ μ½”λ“œλ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ μ—…λ°μ΄νŠΈν•˜κΈ°κ°€ 더 쉽닀
  • ν•¨μˆ˜ 이름을 톡해 μ½”λ“œκ°€ 무엇을 μ˜λ―Έν•˜λŠ”μ§€ μ΄ν•΄ν•˜κΈ° 더 쉽닀.
  • ν•¨μˆ˜λŠ” ν•¨μˆ˜ 호좜 μΈμˆ˜κ°€ ν•¨μˆ˜ 맀개 λ³€μˆ˜μ™€ μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ νƒ€μž… 검사λ₯Ό ν•œλ‹€. (λ§€ν¬λ‘œλŠ” μ•ˆ ν•œλ‹€.)
  • ν•¨μˆ˜λŠ” ν”„λ‘œκ·Έλž¨μ„ 디버그 ν•˜κΈ° μ‰½κ²Œ λ§Œλ“ λ‹€.

κ·ΈλŸ¬λ‚˜ ν•¨μˆ˜λŠ” ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€ λ°œμƒν•˜λŠ” μΌμ •λŸ‰μ˜ μ„±λŠ₯ μ˜€λ²„ν—€λ“œκ°€ μžˆλ‹€λŠ” 단점이 μžˆλ‹€.

μ΄λŠ” CPUκ°€ λ‹€λ₯Έ λ ˆμ§€μŠ€ν„°μ™€ ν•¨κ»˜ μ‹€ν–‰ 쀑인 ν˜„μž¬ λͺ…λ Ήμ–΄μ˜ μ£Όμ†Œλ₯Ό μ €μž₯ν•΄μ•Ό ν•˜λ―€λ‘œ(λ‚˜μ€‘μ— λ°˜ν™˜ν•  μœ„μΉ˜λ₯Ό μ•Œ 수 μžˆλ„λ‘)
λͺ¨λ“  ν•¨μˆ˜ 맀개 λ³€μˆ˜λ₯Ό 생성해야 ν•œλ‹€.

ν• λ‹Ήλœ 값을 μ‚¬μš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μƒˆ μœ„μΉ˜λ‘œ λΆ„κΈ°λœλ‹€.

λ‚΄λΆ€μ—μ„œ μž‘μ„±λœ μ½”λ“œ(μΈμŠ€ν„΄νŠΈ μ½”λ“œ)κ°€ 훨씬 더 λΉ λ₯΄λ‹€.

 

ν¬κ±°λ‚˜ λ³΅μž‘ν•œ νƒœμŠ€ν¬λ₯Ό μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜μ˜ 경우

ν•¨μˆ˜ 호좜의 μ˜€λ²„ν—€λ“œλŠ” ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” 데 κ±Έλ¦¬λŠ” μ‹œκ°„κ³Ό 비ꡐ할 λ•Œ μ€‘μš”ν•˜μ§€ μ•Šλ‹€.

κ·ΈλŸ¬λ‚˜ μΌλ°˜μ μœΌλ‘œλŠ” μ‚¬μš©ν•˜λŠ” μž‘μ€ ν•¨μˆ˜μ˜ 경우,

ν•¨μˆ˜ ν˜ΈμΆœμ— ν•„μš”ν•œ μ‹œκ°„μ΄ μ‹€μ œλ‘œ ν•¨μˆ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ μ‹œκ°„λ³΄λ‹€ 훨씬 λ§Žμ€ κ²½μš°κ°€ μžˆλ‹€.

이둜 인해 μƒλ‹Ήν•œ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆλ‹€.

 

C++은 인라인 ν•¨μˆ˜(Inline Function)λΌλŠ” λ‚΄λΆ€μ—μ„œ μž‘μ„±λœ μ½”λ“œμ˜ 속도와 ν•¨μˆ˜μ˜ μž₯점을 κ²°ν•©ν•˜λŠ” 방법을 μ œκ³΅ν•œλ‹€.

inline ν‚€μ›Œλ“œλŠ” μ»΄νŒŒμΌλŸ¬μ—μ„œ ν•¨μˆ˜λ₯Ό 인라인 ν•¨μˆ˜λ‘œ μ²˜λ¦¬ν•˜λ„λ‘ μš”μ²­ν•œλ‹€.

μ»΄νŒŒμΌλŸ¬κ°€ μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜λ©΄ λͺ¨λ“  인라인 ν•¨μˆ˜κ°€ 인-ν”Œλ ˆμ΄μŠ€(in-place) ν™•μž₯λœλ‹€.

즉, ν•¨μˆ˜ 호좜이 ν•¨μˆ˜ 자체의 λ‚΄μš© λ³΅μ‚¬λ³ΈμœΌλ‘œ λŒ€μ²΄λ˜μ–΄ ν•¨μˆ˜ μ˜€λ²„ν—€λ“œκ°€ μ œκ±°λœλ‹€.

단점은 인라인 ν•¨μˆ˜κ°€ λͺ¨λ“  ν•¨μˆ˜ ν˜ΈμΆœμ— λŒ€ν•΄ μ μ ˆν•œ μœ„μΉ˜μ—μ„œ ν™•μž₯λ˜λ―€λ‘œ

인라인 ν•¨μˆ˜κ°€ κΈΈκ±°λ‚˜ 인라인 ν•¨μˆ˜λ₯Ό μ—¬λŸ¬ 번 ν˜ΈμΆœν•˜λŠ” 경우 컴파일된 μ½”λ“œλ₯Ό μ•½κ°„ 더 크게 λ§Œλ“€ 수 μžˆλ‹€λŠ” 것이닀.

 

예제λ₯Ό 톡해 인라인 ν•¨μˆ˜μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž

 

μ•„μ£Ό κ°„λ‹¨ν•œ ν•¨μˆ˜λ₯Ό ν•˜λ‚˜ λ§Œλ“€μ—ˆλ‹€.

μ •μˆ˜ x와 y 두 개λ₯Ό λ°›κ³ ,

λ‘˜ 쀑에 μž‘μ€ 값을 λ¦¬ν„΄ν•΄μ£ΌλŠ” ν•¨μˆ˜μ΄λ‹€.

쑰건뢀 μ—°μ‚°μž κΈ°μ–΅ μ•ˆ λ‚˜λ©΄ ↓ μ°Έκ³ ν•˜κΈ°

 

Sizeof, μ‰Όν‘œ μ—°μ‚°μž, 쑰건뢀 μ—°μ‚°μž

Sizeof Operator μ–΄λ– ν•œ λ°μ΄ν„°ν˜•μ˜ 크기λ₯Ό μ•Œκ³  싢을 λ•Œ μ‚¬μš©. sizeof μ—°μ‚°μžλŠ” μžλ£Œν˜• λ˜λŠ” λ³€μˆ˜λ₯Ό κ°€μ§€κ³  크기λ₯Ό byte λ‹¨μœ„λ‘œ λ°˜ν™˜ν•˜λŠ” μ—°μ‚°μžλ‹€. νŠΉμ • μ‹œμŠ€ν…œμ—μ„œ μžλ£Œν˜•μ˜ 크기λ₯Ό κ²°μ •ν•˜κΈ° μœ„ν•΄ C++

hyoniidaaa.tistory.com

이 min ν•¨μˆ˜λ₯Ό mainμ—μ„œ μ‚¬μš©ν•œλ‹€κ³  μƒκ°ν•΄λ³΄μž.

 

ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λ©΄μ„œ λ¨Όμ € min ν•¨μˆ˜κ°€ ν˜ΈμΆœλœλ‹€.

μ–΄λ”˜κ°€μ— μ €μž₯λ˜μ–΄μžˆλ‹€κ°€ min ν•¨μˆ˜μ˜ μ‹€ν–‰μ½”λ“œλ₯Ό κ°€μ Έμ˜€κ³ 

그거에 λ”°λΌμ„œ μ‹€ν–‰ν•˜λΌλŠ” λͺ…령이 λ–¨μ–΄μ§„λ‹€.

그럼 κ·Έκ±Έ κ°€μ Έμ˜€κ³  λ³€μˆ˜ x와 yλ₯Ό μ„ μ–Έν•˜κ³ 

κ°’ 5,6을 볡사λ₯Ό ν•˜κ³ 

κ·Έλ‹€μŒ x > y ? y : x; 이 뢀뢄을 싀행을 μ‹œν‚€κ³ 

κ·Έλ‹€μŒμ— return을 ν•΄μ£Όκ³ 

λ°›μ•„μ˜€λŠ” κ³³μ—μ„œ 값을 λ°›μ•„μ˜€κ³ 

그것을 좜λ ₯을 ν•˜λŠ” μ΄λŸ¬ν•œ 일련의 과정이 λ²Œμ–΄μ§„λ‹€.

 

이런 μž‘μ€ ν•¨μˆ˜κ°€ μ•„μ£Ό 많이 λ°˜λ³΅λ˜λŠ” κ²½μš°λ„ μžˆλ‹€.

κ·Έλž˜μ„œ μ–΄λ–€ κ²½μš°μ—λŠ” μ‹€μ œ κ³„μ‚°ν•˜λŠ” λΆ€λΆ„ (x > y ? y : x;) 보닀

μ§€κΈˆ λ§μ”€λ“œλ¦° 일련의 과정듀이 더 μ‹œκ°„μ΄ 많이 걸릴 λ•Œλ„ μžˆλ‹€.

κ·Έλž˜μ„œ κ·Έ 과정을 쀄이기 μœ„ν•΄μ„œ 인라인 ν•¨μˆ˜λΌλŠ” 것을 μ‚¬μš©μ„ ν•  λ•Œκ°€ μžˆλ‹€,

 

μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λƒλ©΄

κ·Έλƒ₯ μ•žμ—λ‹€κ°€ inline이라고 써주면 λœλ‹€.

 

κ°„λ‹¨ν•˜λ‹€.

보톡 헀더 νŒŒμΌμ— ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ 많이 μ‚¬μš©ν•œλ‹€.

κ·Έλ‹€μŒμ— μ˜€ν”ˆμ†ŒμŠ€ μ½”λ“œλ₯Ό 보면 ꡉμž₯히 λ§Žμ€ ν•¨μˆ˜λ“€μ„ 거의 λ‹€ inline으둜 μΉ ν•΄λ†“λŠ” κ²½μš°κ°€ μžˆλ‹€.

inline으둜 λ°”κΎΈκ²Œ 되면 사싀 μ–˜λŠ” ν•¨μˆ˜κ°€ μ•„λ‹Œ κ²ƒμ²˜λŸΌ μž‘λ™μ„ ν•œλ‹€.

 

.x > y ? y : x; 이 μ½”λ“œλ₯Ό (5 > 6 ? 6 : 5) μ΄λ ‡κ²Œ μž‘μ„±λœ 것 처럼 컴파일이 λœλ‹€.

μ»΄νŒŒμΌλŸ¬κ°€ 봀을 λ•Œ μ•„ μ–˜κ°€ μΈλΌμΈμ΄λ‹ˆκΉŒ μ΄λ ‡κ²Œ λ„£μ–΄μ£ΌμžλŠ” μ‹μœΌλ‘œ μž‘λ™ν•œλ‹€.

(5 > 6 ? 6 : 5) μ΄λ ‡κ²Œ λ˜μ–΄μžˆμœΌλ©΄ ν•¨μˆ˜κ°€ 호좜될 일도 μ—†κ³ 

local variable인 x, yκ°€ 선언될 일도 μ—†κ³  μ‚­μ œλ  일도 μ—†μ–΄μ„œ λΉ λ₯΄λ‹€.

κ·Έλž˜μ„œ λ§Žμ€ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ΄ 인라인 ν•¨μˆ˜λ₯Ό 많이 μ‚¬μš©μ„ ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€.

 

그런데 인라인 ν•¨μˆ˜λ₯Ό μ‹€μ œ μ‚¬μš©ν•˜κΈ°μ— μ•žμ„œ μ•Œμ•„μ•Ό ν•˜λŠ” 사싀이 μžˆλ‹€.

이 inline ν‚€μ›Œλ“œλŠ” κ°•μ œλ‘œ 이 ν•¨μˆ˜λ₯Ό 무쑰건 inline으둜 해라라고 ν•΄μ„œ λ§Œλ“  게 μ•„λ‹ˆκ³ 

μ΄λ ‡κ²Œ ν•  수 있으면 ν•΄ μ£Όμ„Έμš”~라고 κΆŒμœ ν•˜λŠ” λ‰˜μ•™μŠ€λ‹€.

inline ν‚€μ›Œλ“œλŠ” ꢌμž₯ 사항일 뿐이닀.

μ»΄νŒŒμΌλŸ¬λŠ” 인라인에 λŒ€ν•œ μš”μ²­μ„ 자유둭게 λ¬΄μ‹œν•  수 μžˆλ‹€.( κΈ΄ ν•¨μˆ˜λ₯Ό 인라인화 ν•˜λ €κ³  ν•˜λ©΄ λ¬΄μ‹œν•  κ°€λŠ₯성이 μžˆλ‹€.)

κ·Έλž˜μ„œ μ»΄νŒŒμΌλŸ¬κ°€ λ”± 봀을 λ•Œ μ•„ μ–˜λŠ” 인라인을 μ“°λ©΄ 쒋을 것 κ°™λ„€? 생각해 λ³΄λŠ” 정도가 λ˜λŠ” κ±°λ‹€.

κ·Έλž˜μ„œ λͺ¨λ“  ν•¨μˆ˜λ₯Ό inline으둜 λ°”κΎΌλ‹€κ³  ν•΄μ„œ λΉ¨λΌμ§€λŠ” 것은 μ ˆλŒ€ μ•„λ‹ˆλ‹€.

 

그리고 μ΅œκ·Όμ—λŠ” μ»΄νŒŒμΌλŸ¬κ°€ μ•„μ£Ό μ’‹μ•„μ Έμ„œ

inline이 없어도 μžκΈ°κ°€ 생각할 λ•Œ λ…Όλ¦¬μ μœΌλ‘œ 따져봀을 λ•Œ

μ•„ 여기에 inline λ„£μœΌλ©΄ μ•„μ£Ό 빨라지겠넀? μ‹ΆμœΌλ©΄ μžκΈ°κ°€ μ•Œμ•„μ„œ 인라인 ν™”ν•œλ‹€.

inline을 μ“΄λ‹€κ³  ν•΄μ„œ λΉ¨λΌμ§€λŠ” 보μž₯도 μ—†κ³  μ•ˆ μ“΄λ‹€κ³  μ•ˆ λΉ¨λΌμ§€λŠ” 보μž₯도 μ—†λ‹€λŠ” μ‹μœΌλ‘œ μ–˜κΈ°κ°€ λ‚˜μ˜€κ³  μžˆλ‹€.

μ•„λ¬΄νŠΌ μ½”λ”©ν•  λ•Œ inline에 μ˜μ‘΄ν•΄μ„œ μ΅œμ ν™”λ₯Ό ν•˜κΈ° μ‹œμž‘ν•˜λ©΄ μ’€ νž˜λ“€μ–΄μ§„λ‹€.

 

인라인은 μ‚¬μš©λ²•μ΄ κ°„λ‹¨ν•˜μ§€λ§Œ

더 μ€‘μš”ν•œ 것은 μ»΄νŒŒμΌλŸ¬κ°€ μ§„μ§œ 해쀄지 μ•ˆ ν•΄μ€„μ§€λŠ” μ•ŒκΈ° μ–΄λ ΅λ‹€λŠ” 것이닀.

또 ν•œ κ°€μ§€ 단점은 λ§Œμ•½ min 같은 inline으둜 된 ν•¨μˆ˜κ°€ μ—„μ²­ 많고

μ»΄νŒŒμΌλŸ¬κ°€ 정말 inline으둜 κ΅¬ν˜„μ„ ν–ˆλ‹€λ©΄ 컴파일된 ν”„λ‘œκ·Έλž¨μ΄ 많이 컀진닀.

ν”„λ‘œκ·Έλž¨μ΄ 컀지면 μ–΄μ¨Œλ“  κ·Έ μ•ˆμ—μ„œ 데이터가 μ™”λ‹€ κ°”λ‹€ ν•˜λŠ”λ° 더 λ§Žμ€ μ‹œκ°„μ΄ 걸리기 λ•Œλ¬Έμ—

μ½”λ“œκ°€ λ„ˆλ¬΄ μ»€μ Έμ„œ 인라인을 μ‚¬μš©ν•œ 효과λ₯Ό λͺ» 보게 될 μˆ˜λ„ μžˆλ‹€.

μ½”λ“œλ₯Ό 뢀풀릴 κ°€λŠ₯성이 μžˆμœΌλ―€λ‘œ ν•¨μˆ˜λ₯Ό 인라인화 ν•˜λŠ” 것은 λ‚΄λΆ€ 루프가 μ—†λŠ” 짧은 ν•¨μˆ˜μ— κ°€μž₯ μ ν•©ν•˜λ‹€.

 

인라인 문법에 λŒ€ν•΄μ„œλŠ” λ§μ”€λ“œλ ΈμœΌλ‚˜ μ‚¬μš©ν•˜λŠ” 게 ν™•μ‹€νžˆ μ’‹λ‹€ ꢌμž₯ν•œλ‹€ μ΄λ ‡κ²ŒλŠ” λ§μ”€λ“œλ¦¬κΈ° μ–΄λ ΅λ‹€.