Inline Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² c: ВстроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (inline-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) Π² C++

c++ — ΠŸΠΎΡ‡Π΅ΠΌΡƒ inline-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… Π½Π΅ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠ΅?

Если спСцификация языка Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ошибки Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ, Π·Π½Π°Ρ‡ΠΈΡ‚ ошибки Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ. А дальшС ΡƒΠΆΠ΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π²Ρ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ?

Π’ классичСской Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ½Π»Π°ΠΉΠ½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с внСшним связываниСм для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… компилятор ΠΏΡ€ΠΈ компиляции Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΅Π΄ΠΈΠ½ΠΈΡ† трансляции Ρ€Π΅ΡˆΠΈΠ» ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅Π»Π°, разумССтся, Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. Π’ процСссС компиляции каТдая Π΅Π΄ΠΈΠ½ΠΈΡ†Π° трансляции ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ свою копию Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² своСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ.

Однако Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ особым ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ — Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ мноТСства ΠΊΠΎΠΏΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ внСшнСго символа ΠΏΡ€ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠ΅ Π»ΠΈΠ½ΠΊΠ΅Ρ€ Π½Π΅ Π²Ρ‹Π΄Π°Π²Π°Π» ошибки, Π° Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ ΠΌΠΎΠ»Ρ‡Π° удалял всС ΠΊΠΎΠΏΠΈΠΈ, оставляя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ. Π’ΠΎ Π΅ΡΡ‚ΡŒ компилятор C++ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ «ΡΠ²Π°Π»ΠΊΡƒ» ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, раскиданных ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ, Π° Π»ΠΈΠ½ΠΊΠ΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΌ собираСт всё вмСстС ΠΈ занимаСтся чисткой этой «ΡΠ²Π°Π»ΠΊΠΈ».

Π’ компиляторах сСмСйства *nix эта ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠ° — это ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ экспортируСмого символа, ΠΊΠ°ΠΊ Ρ‚.Π½Π°Π·. «ΡΠ»Π°Π±ΠΎΠ³ΠΎ» (weak) символа. Π’ компиляторС MSVC++ сущСствуСт аналогичная ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠ°

selectany. Π›ΠΈΠ½ΠΊΠ΅Ρ€Ρ‹ Π²Ρ‹Π΄Π°ΡŽΡ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ мноТСствСнного опрСдСлСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли встрСтят Π΄Π²Π° ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… «ΡΠΈΠ»ΡŒΠ½Ρ‹Ρ…» символа Π² процСссС Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ. Если ΠΆΠ΅ «ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΉ» символ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ (Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ «ΡΠ»Π°Π±Ρ‹Π΅»), Ρ‚ΠΎ ΠΏΠΎΠ±Π΅ΠΆΠ΄Π°Π΅Ρ‚ «ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΉ» символ, Π° «ΡΠ»Π°Π±Ρ‹Π΅» символы ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ. Если «ΡΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ» символа Π½Π΅Ρ‚ Π²ΠΎΠΎΠ±Ρ‰Π΅, Π° Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ «ΡΠ»Π°Π±Ρ‹Π΅», Ρ‚ΠΎ ΠΏΠΎΠ±Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ (ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ) ΠΈΠ· «ΡΠ»Π°Π±Ρ‹Ρ…». Никакой ошибки ΠΏΡ€ΠΈ этом Π½Π΅ рапортуСтся.

Когда компилятор Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅Π»ΠΎ для inline-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с внСшним связываниСм, ΠΎΠ½ просто ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ символ для Π»ΠΈΠ½ΠΊΠ΅Ρ€Π° ΠΊΠ°ΠΊ «ΡΠ»Π°Π±Ρ‹ΠΉ» — ΠΈ всС.

(На этом ΠΆΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ΅ построСна трансляция ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΊΠ°ΠΊ извСстно, Ρ‚ΠΎΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΈ Ρ‚ΠΎΠΆΠ΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‚ свои ΠΊΠΎΠΏΠΈΠΈ Π²ΠΎ всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΈ ΠΈΡ… инстанцирования.)

НапримСр, скомпилировав Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ простой исходник Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»

inline void bar() {}
void (*foo())()
{
  return bar;
}

ΠΈ просмотрСв содСрТимоС этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ nm ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ

0000000000000000 W _Z3barv
0000000000000000 T _Z3foov

Π‘ΡƒΠΊΠΎΠ²ΠΊΠ° W ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ «ΡΠ»Π°Π±Ρ‹ΠΉ» символ, Π° Π±ΡƒΠΊΠΎΠ²ΠΊΠ° T — «ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΉ» символ. Π’ΠΎ всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ Ρ‚Π΅Π»ΠΎ для Ρ‚Π°ΠΊΠΎΠΉ inline Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ _Z3barv с ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΎΠΉ W.


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΎ ΠΊΠ°ΠΊΠΎΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ‡Π΅Ρ€Π΅Π· Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ мноТСства Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ Ρ€Π΅Ρ‡ΠΈ: Π² всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΡ… инлайновая функция с внСшним связываниСм Π΄ΠΎΠ»ΠΆΠ½Π° вСсти сСбя Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ любая другая функция с внСшним связываниСм, Ρ‚.Π΅., Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ½Π° обязана ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ адрСс Π²ΠΎ всСх Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… трансляции.


ΠŸΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌ эффСктом Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ «ΠΊΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΉ» ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅Ρ‚ Π½Π°Ρ‡Π°Π»Π° ΠΈ ΠΊΠΎΠ½Ρ†Π°, Π° Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π°, становится Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌ. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Π‘++ компиляторы Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Π² ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅.


Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ историчСскиС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. «ΠœΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½Ρ‹Π΅» Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π»ΠΈ Ρ‚Π΅Π» для ΠΈΠ½Π»Π°ΠΉΠ½ΠΎΠ²Ρ‹Ρ… ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π΅ компиляции. Они выполняли ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΡƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ собирали ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠΌ функциям Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½Ρ‹ Ρ‚Π΅Π»Π°, Π·Π°Ρ‚Π΅ΠΌ снова Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ компилятор ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π΅Π»Π° для Ρ‚Π°ΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΡƒΠΆΠ΅ выполняли Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΡƒΡŽ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΡƒ. Но срСди популярных компиляторов (GCC/Clang/MSVC) Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅ приТился.

c++ — ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат Ρ†ΠΈΠΊΠ»Ρ‹, Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ ΠΈΠ»ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ, ΠΏΠ»ΠΎΡ…ΠΎ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Ρ‹ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π½ΠΈΡŽ (inline)

Вопрос построСн Π½Π° тСрминологичСской ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Π΅. ВстраиваниС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ — это Π½Π΅ свойство самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° всСгда ΠΈΠΌΠ΅Π½Π½ΠΎ свойство ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Бвойства самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, разумССтся, ΠΈΠ³Ρ€Π°ΡŽΡ‚ Ρ€ΠΎΠ»ΡŒ Π² принятии Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎ Ρ‚ΠΎΠΌ, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² встроСн, Π½ΠΎ всС Ρ€Π°Π²Π½ΠΎ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ принимаСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΠΎ. Одни Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ встроСны, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅ встроСны. Π”Π°ΠΆΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅, ΠΌΠΎΠ³ΡƒΡ‚ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π»ΠΈ этот ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ².

  • Π£Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ Π½Π΅ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ, относится ΠΊ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ «ΡΡ‚ΠΎ Π±Ρ‹Π»ΠΎ Π΄Π°Π²Π½ΠΎ ΠΈ Π½Π΅ΠΏΡ€Π°Π²Π΄Π°».

    ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ компилятор Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ эвристичСских ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π°Π΅Ρ‚ Π΅ΠΌΡƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎ Ρ‚ΠΎΠΌ, Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ Π»ΠΈ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ встраивания. Π’ ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ ΠΈΠ· старинных компиляторов этот эвристичСский ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π» ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ†ΠΈΠΊΠ»ΠΎΠ² (Borland ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² этом Ρ€ΠΎΠ΄Π΅).

    На самом Π΄Π΅Π»Π΅ Ρ†ΠΈΠΊΠ»Ρ‹ Π½Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΈΠ· сСбя Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€Π΅Π³Ρ€Π°Π΄ для встраивания. МнС Π½Π΅ извСстны Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ соврСмСнныС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹ ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΈΡΡŒ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ.

  • Π£Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π½Π΅ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ — это ΠΊΠ°ΠΊ Ρ€Π°Π· яркий ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ тСрминологичСской ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ я писал Π²Ρ‹ΡˆΠ΅. Π­Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ²Ρ‹, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π½Π΅ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ‚ΠΎΠΉ ΠΆΠ΅ самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, ΠΌΠΎΠ³ΡƒΡ‚ прСкрасно Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ.

    ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ², сдСланный Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ: ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π° стадии компиляции Π½Π΅ ясно, какая функция Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ. Однако Ссли компилятор Π² состоянии ΡΠΎΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π½Π° стадии компиляции, какая функция Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΎΠ½ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ встроит ΠΈ Ρ‚Π°ΠΊΠΎΠΉ Π²Ρ‹Π·ΠΎΠ².

    ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΉ часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ вопрос, основанный Π½Π° Π΄Π°Π½Π½ΠΎΠΉ тСрминологичСской ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Π΅ — вопрос ΠΎ встраивании Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² классов. Они вСдь Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ «Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ» ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ встроСны, ΠΏΡ€Π°Π²Π΄Π°? НС ΠΏΡ€Π°Π²Π΄Π°. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, сам ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π±Π΅Π· использования Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π² ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠΌ количСствС контСкстов сам компилятор Π² состоянии ΡΠΎΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся Π² Π΄Π°Π½Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΈ, соотвСтствСнно, Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ этот Π²Ρ‹Π·ΠΎΠ².

  • Π’Ρ‹Π·ΠΎΠ²Ρ‹ рСкурсивных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ. Если компилятор Π½Π° стадии компиляции Π² состоянии ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ рСкурсии, Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ эти Π²Ρ‹Π·ΠΎΠ²Ρ‹ («Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ») Π½Π° всю Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ. Если компилятор Π½Π΅ Π² состоянии Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΡ†Π΅Π½ΠΊΠΈ, Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ рСкурсивныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ фиксированной Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹, послС Ρ‡Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ рСкурсивный Π²Ρ‹Π·ΠΎΠ². ВстраиваниС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² рСкурсивных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² этом ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚ΠΊΠ΅ Ρ†ΠΈΠΊΠ»ΠΎΠ².

Одной ΠΈΠ· ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΡ… ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… ситуаций цСлСсообразности встраивания Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ являСтся, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ситуация, ΠΊΠΎΠ³Π΄Π° Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ извСстно, Ρ‡Ρ‚ΠΎ нСкоторая функция вызываСтся Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· (Π² пространствСнном смыслС, Ρ‚.Π΅. исходный ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ содСрТит Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½ΠΎ мСсто с Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ). Π’Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ смысла ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ «Ρ‚яТСла» эта функция. (Π‘ этим ΠΈΠ΄Π΅Ρ‚ ряд ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΎΠΊ, Π½ΠΎ ΠΊ Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π΅ΠΌΠ΅ ΠΎΠ½ΠΈ Π½Π΅ относятся.) НапримСр, Ссли функция ΠΈΠΌΠ΅Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ связываниС ΠΈ вызываСтся Π² своСй Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ трансляции Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Ρ‚ΠΎ соврСмСнныС компиляторы встроят этот Π²Ρ‹Π·ΠΎΠ² нСзависимо ΠΎΡ‚ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΈΠ½Ρ‹Ρ… ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π².

Π’ компиляторС GCC Π·Π° это ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ опция -finline-functions-called-once, которая Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΡƒΠΆΠ΅ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ -O1.

Π’ качСствС Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π² компиляторС MSVC++ Π΅ΡΡ‚ΡŒ #pragma-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ inline_recursion ΠΈ inline_depth, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ встраиваниСм рСкурсивных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π³Π»ΡƒΠ±ΠΈΠ½ΠΎΠΉ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚ΠΊΠΈ рСкурсии.

Когда «Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½Ρ‹ΠΉ» нСэффСктивСн? (Π² C)

встроСнный Π΄Π΅Π»Π°Π΅Ρ‚ Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ:

  1. Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· «ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ опрСдСлСния» (см. Π½ΠΈΠΆΠ΅). Π­Ρ‚ΠΎΡ‚ всСгда примСняСтся .
  2. Π”Π°Π΅Ρ‚ компилятору подсказку, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это.

#1 ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, Ссли ΠΎΠ½ΠΎ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅), Π΄Π°ΠΆΠ΅ Ссли #2 ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½.

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ компиляторы часто Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ (особСнно Ссли доступна оптимизация Π½Π° основС ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ).


[Π Π•Π”ΠΠšΠ’Π˜Π ΠžΠ’ΠΠ’Π¬: ΠΏΠΎΠ»Π½Ρ‹Π΅ ссылки ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ тСкст]

Π”Π²Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ ΠΏΡƒΠ½ΠΊΡ‚Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΈΠ· стандарта ISO/ANSI (ISO/IEC 9899:1999(E), ΡˆΠΈΡ€ΠΎΠΊΠΎ извСстного ΠΊΠ°ΠΊ Β«C99Β»).

Π’ Β§6.9 Β«Π’Π½Π΅ΡˆΠ½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅Β», ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„ 5:

Π’Π½Π΅ΡˆΠ½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ β€” это внСшнСС объявлСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ являСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΊΡ€ΠΎΠΌΠ΅ встроСнного опрСдСлСния) ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Если ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ с внСшнСй связью, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ (ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° sizeof, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся цСлочислСнная константа), Π³Π΄Π΅-Ρ‚ΠΎ Π²ΠΎ всСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½ΠΎ внСшнСС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΈΡ… Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ.

Π₯отя эквивалСнтноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² C++ явно называСтся ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ опрСдСлСния (ODR), ΠΎΠ½ΠΎ слуТит Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ†Π΅Π»ΠΈ. Π’Π½Π΅ΡˆΠ½ΠΈΠ΅ (Ρ‚. Π΅. Π½Π΅ «статичСскиС» ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ для ΠΎΠ΄Π½ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° β€” ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ΄ΠΈΠ½ исходный Ρ„Π°ΠΉΠ») ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Ρ‚ΠΎΠ»ΡŒΠΊΠΎ , Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ являСтся встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΈ .

Π’ Β§6.7.4, Β«Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉΒ», ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ встроСнноС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово:

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ быстрСС. [118] Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ опрСдСляСтся опрСдСляСтся Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ.

И сноска (нСнормативная), Π½ΠΎ содСрТит Ρ€Π°Π·ΡŠΡΡΠ½Π΅Π½ΠΈΠ΅:

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρƒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡƒ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚Π°ΠΊΡƒΡŽ ​​как «встроСнная подстановка». ВстроСнная Π·Π°ΠΌΠ΅Π½Π° Π½Π΅ являСтся тСкстовой Π·Π°ΠΌΠ΅Π½ΠΎΠΉ ΠΈ Π½Π΅ создаСт Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ макроса, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½ΠΎ ΠΈΠΌΠ΅Π»ΠΎ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ появлСния Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Π½Π΅ Π² мСстС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ; Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ относятся ΠΊ объявлСниям Π² области видимости, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится Ρ‚Π΅Π»ΠΎ. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ функция ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ адрСс, нСзависимо ΠΎΡ‚ количСства встроСнных ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ.

РСзюмС: Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ C ΠΈ C++ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ ΠΎΡ‚ встроСнного ΠΊΠΎΠ΄Π° совсСм Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚. Π•Π³ΠΎ очСвидная основная Ρ†Π΅Π»ΡŒ β€” ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ β€” ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°. Но Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, трСбуСтся ослаблСниС Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ опрСдСлСния.

(ВсС ударСния Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ… ΠΈΠ· стандарта.)


Π Π•Π”ΠΠšΠ’Π˜Π ΠžΠ’ΠΠ’Π¬ 2: НСсколько Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠΉ:

  • Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ограничСния Π½Π° внСшниС встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π£ вас Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ статичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° статичСскиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹/Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ области TU.
  • Волько Ρ‡Ρ‚ΠΎ Π²ΠΈΠ΄Π΅Π» это Π² «ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ всСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹» VC++, Ρ‡Ρ‚ΠΎ являСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ компилятор Π΄Π΅Π»Π°Π΅Ρ‚ свои собствСнныС встроСнныС дСйствия, Π° Π½Π΅ Π°Π²Ρ‚ΠΎΡ€.

ВстроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² языкС C: ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ обСспСчСнии ADAS | Π‘Π»ΠΎΠ³

11 июля 2017 г.

Π― люблю ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ «закулисныС» ΠΊΠ»ΠΈΠΏΡ‹ Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ². Π£Π΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠ°ΠΊ Π°ΠΊΡ‚Π΅Ρ€Ρ‹, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ вся ΠΎΡΡ‚Π°Π»ΡŒΠ½Π°Ρ ΡΡŠΠ΅ΠΌΠΎΡ‡Π½Π°Ρ Π³Ρ€ΡƒΠΏΠΏΠ° Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ вмСстС Π½Π°Π΄ созданиСм Ρ„ΠΈΠ»ΡŒΠΌΠ°. ΠŸΡ€ΠΈΡΡ‚Π½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈ вСсСлыС ΠΊΠ°Π΄Ρ€Ρ‹. Видя малСнькиС ошибки ΠΈ Π½Π΅Π³Π»Π°ΠΌΡƒΡ€Π½ΡƒΡŽ сторону Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ², я Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡ†Π΅Π½ΠΈΠ²Π°ΡŽ ΠΈΡ… Π½Π° большом экранС. Π₯отя компиляторы Π½Π΅ Ρ‚Π°ΠΊ интСрСсны, ΠΊΠ°ΠΊ Ρ„ΠΈΠ»ΡŒΠΌΡ‹, Ρƒ Π½ΠΈΡ… Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Ρ‡Π΅Π³ΠΎ происходит Π·Π° кулисами. Π›Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ компилятора, Π½Π΅ имСя прСдставлСния ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ компилятор Π½Π° самом Π΄Π΅Π»Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ с вашим ΠΊΠΎΠ΄ΠΎΠΌ. Однако ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ эти инструмСнты, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π²Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π±ΠΎΠ»Π΅Π΅ эффСктивно. Π’Π°ΠΊΠΈΠ΅ инструмСнты, ΠΊΠ°ΠΊ встраиваниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π½ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ мСсто. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»Ρ‹ ΠΊΠΎΠ΄Π° Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ. Если Π²Ρ‹ этого Π½Π΅ сдСлаСтС, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ пространство Π±Π΅Π· увСличСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ?

Если Ρ„ΠΈΠ»ΡŒΠΌ слишком Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ послС съСмок, сцСны ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π΅Π·Π°Π½Ρ‹ ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ Π½Π° этапС постобработки. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ встраиваниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ позволяСт ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для Π²Ρ‹Π·ΠΎΠ²Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠΆΠ΅ написали ΠΊΠΎΠ΄. Π’ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ большС мСста, Ρ‡Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅, Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Ρ€Π°Π·Π½ΠΈΡ†Π° Π² Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Ρ… минимальна.

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ встраиваниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ? ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π—Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, выполняСт свои ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ значСния. Когда Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ встроСны, компилятор замСняСт Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ вашС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚Π΅ врСмя Π½Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π’Ρ‹ просто запускаСтС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² соотвСтствии с вашим ΠΊΠΎΠ΄ΠΎΠΌ. Бпособ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ компиляторы это Π΄Π΅Π»Π°ΡŽΡ‚, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТСн, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ вашС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π² состоянии ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π±Ρ‹Π»Π° Π»ΠΈ функция встроСна ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° ваТная Π²Π΅Ρ‰ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠ° Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ «встроСнным» Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ компилятор Π½Π° самом Π΄Π΅Π»Π΅ встроит это. Π’Π°ΠΌ просто Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Β«ΠΏΠΎΠ΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒΒ» компилятору, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ.


ВстраиваниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π²Π°ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вашС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС.

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π°, встраиваниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π³ΠΎΠ»ΠΎΠ²ΠΎΠ»ΠΎΠΌΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ пространства. ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ΠΎΠ²Ρ‹Ρ… систСм ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŽ (ADAS) Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡ‚ΠΈ Ρ‚ΠΎΠ½ΠΊΠΈΠΉ баланс ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. Π’Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ автоматичСскоС Ρ‚ΠΎΡ€ΠΌΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ быстро, Π½ΠΎ Π²Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±Ρ‹Π»Π° достаточно малСнькой, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΡΡ Π½Π° вашСм ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠΈ. Когда ваш компилятор встраиваСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠ½ фактичСски замСняСт ваши строки Π²Ρ‹Π·ΠΎΠ²Π° строками Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Если сама функция Π΄Π»ΠΈΠ½Π½Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²Π°, ΠΎΠ½Π° Π·Π°ΠΉΠΌΠ΅Ρ‚ большС мСста. Иногда Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ ΠΈ ΠΈΡ… Π²Ρ‹Π·ΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ мСста ΠΏΡ€ΠΈ встраивании. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большС ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ вашСго ΠΊΠΎΠ΄Π°. Если функция вызываСтся нСсколько Ρ€Π°Π·, ваш компилятор ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ нСсколько Π΅Π΅ ΠΊΠΎΠΏΠΈΠΉ, тСряя мСсто. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π²Π°ΠΌ всСгда Π½ΡƒΠΆΠ½ΠΎ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»Ρ‹ ΠΊΠΎΠ΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ слишком ΠΌΠ½ΠΎΠ³ΠΎ мСста Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ.

КакиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ слСдуСт Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ

Π•ΡΡ‚ΡŒ Π΄Π²Π° основных Ρ‚ΠΈΠΏΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ слСдуСт ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ, Ссли это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ: ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ статичСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ Π²Π°ΠΌ, вСроятно, Π½Π΅ слСдуСт Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ часто ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‚ΡΡ.

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” это Π½ΠΈΠ·ΠΊΠΎ висящий ΠΏΠ»ΠΎΠ΄ встраивания. Если функция состоит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ количСства строк, Ρ‡Ρ‚ΠΎ ΠΈ Π΅Π΅ Π²Ρ‹Π·ΠΎΠ², Π²Ρ‹ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΅Π΅ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Π½ΠΎ с Π±ΠΎΠ»Π΅Π΅ высокой ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ. БтатичСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ подходят для встраивания. Они особСнно Ρ…ΠΎΡ€ΠΎΡˆΠΈ для встраивания, ΠΊΠΎΠ³Π΄Π° Ρƒ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ². Π•ΡΡ‚ΡŒ нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±ΠΎΠ»Π΅Π΅ слоТных прСимущСств встраивания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½ΠΎ ΠΎΠ½ΠΈ выходят Π·Π° Ρ€Π°ΠΌΠΊΠΈ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ. ВстраиваниС ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… ΠΈ статичСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π° мСньшСС врСмя, Π½Π΅ увСличивая Ρ€Π°Π·ΠΌΠ΅Ρ€ вашСго ΠΊΠΎΠ΄Π°.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌ нСдостатком встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ большС мСста. ОсобСнно, Ссли функция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ встраиваСтС, довольно длинная. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ нСпосрСдствСнно Π² свой ΠΊΠΎΠ΄. Если функция ΠΎΡ‡Π΅Π½ΡŒ длинная, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ большС строк, Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ.

ΠžΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *