Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 82

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

6.5.2. ВстраиваСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ constexpr

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 6.3.2 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° нСбольшая функция, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ ссылку Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ строку ΠΈΠ· Π΄Π²ΡƒΡ… ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Π΅ΠΉ. К прСимущСствам опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ‚Π°ΠΊΠΎΠΉ малСнькой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ относятся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅.

β€’ ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ shorterString() ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ понятнСС, Ρ‡Π΅ΠΌ эквивалСнтноС условноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

β€’ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Она Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ каТдая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Ρ‚Π΅ΠΌ ΠΆΠ΅ способом.

β€’ Π•сли придСтся внСсти ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΠΏΡ€ΠΎΡ‰Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Π½Π΅ Π²Ρ‹ΠΈΡΠΊΠΈΠ²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ всС случаи примСнСния эквивалСнтного выраТСния.

β€’ Π€ΡƒΠ½ΠΊΡ†ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ использована ΠΏΡ€ΠΈ написании Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

Однако Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ shorterString() Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ нСдостаток: Π΅Π΅ Π²Ρ‹Π·ΠΎΠ² происходит ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ вычислСниС эквивалСнтного выраТСния. На Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ машин ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ осущСствляСтся довольно ΠΌΠ½ΠΎΠ³ΠΎ дСйствий: ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ рСгистры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ послС Π²Ρ‹Ρ…ΠΎΠ΄Π°; происходит ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²; ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½ΠΎΠ²ΠΎΠΌΡƒ участку ΠΊΠΎΠ΄Π°.

ВстраиваСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π° Π²Ρ‹Π·ΠΎΠ²

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, объявлСнной встраиваСмой (inline) ΠΏΡ€ΠΈ компиляции, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, встраиваСтся ΠΏΠΎ мСсту Π²Ρ‹Π·ΠΎΠ²Π°. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ функция shorterString() объявлСна встраиваСмой, Π° Π΅Π΅ Π²Ρ‹Π·ΠΎΠ² ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ Π²ΠΈΠ΄:

cout << shorterString(s1, s2) << endl;

ΠŸΡ€ΠΈ компиляции Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ окаТСтся встроСно ΠΏΠΎ мСсту Π²Ρ‹Π·ΠΎΠ²Π°, ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получится Π½Π΅Ρ‡Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ:

cout << (s1.size() < s2.size() ? s1 : s2) << endl;

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²ΠΎ врСмя выполнСния удастся ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Ρ‚Ρ€Π°Ρ‚, связанных с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ shorterString().

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ shorterString() встраиваСмой, Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ, ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚ΠΈΠΏΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово inline.

// встраиваСмая вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сравнСния Π΄Π²ΡƒΡ… строк

inline const string &

shorterString(const string &s1, const string &s2) {

 return s1.size() <= s2.size() ? s1 : s2;

}

ОбъявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ встраиваСмой являСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠ΅ΠΉ компилятору. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ.

На самом Π΄Π΅Π»Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ встраивания примСняСтся Π² процСссС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π² Ρ…ΠΎΠ΄Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΊΠΎΠ΄ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²Ρ‹Π·ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… происходит достаточно часто, встраиваСтся ΠΏΠΎ мСсту Π²Ρ‹Π·ΠΎΠ²Π°. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ компиляторов Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ рСкурсивныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Ѐункция Π½Π° 75 строк Ρ‚Π°ΠΊΠΆΠ΅, вСроятно, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ встроСна.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ constexpr

Ѐункция constexpr β€” это функция, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° Π² константном Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ (см. Ρ€Π°Π·Π΄Π΅Π» 2.4.4). Ѐункция constexpr опрСдСляСтся ΠΊΠ°ΠΊ любая другая функция, Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ограничСниям: Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ ΠΈ Ρ‚ΠΈΠΏ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°ΠΌΠΈ (см. Ρ€Π°Π·Π΄Π΅Π» 2.4.4), Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ return:

constexpr int new_sz() { return 42; }

constexpr int foo = new_sz(); // ok: foo - константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 

Π—Π΄Π΅ΡΡŒ функция new_sz ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠ°ΠΊ constexpr, ΠΎΠ½Π° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ (Π²ΠΎ врСмя компиляции), Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ new_sz() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, поэтому Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ constexpr ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ foo.

Если это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, компилятор Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ constexpr Π΅Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. Для этого функция constexpr нСявно считаСтся встраиваСмой.

Π’Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ constexpr ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Ссли ΠΎΠ½ΠΈ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ дСйствий Π²ΠΎ врСмя выполнСния. НапримСр, функция constexpr ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ пустыС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, псСвдонимы Ρ‚ΠΈΠΏΠ° (см. Ρ€Π°Π·Π΄Π΅Π» 2.5.1) ΠΈ объявлСния using.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ constexpr ΠΏΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ являСтся константой:

// scale(arg) - константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ссли arg - константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

constexpr size_t scale(size_t cnt) { return new_sz() * cnt; }

Ѐункция scale() Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ссли Π΅Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ константным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π½ΠΎ Π½Π΅ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС:

int arr[scale(2)]; // ok: scale(2) - константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

int i = 2;         // i - нСконстантноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

int a2[scale(i)];  // ошибка: scale(i) - нСконстантноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

Если ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (Ρ‚Π°ΠΊΠΎΠ΅ ΠΊΠ°ΠΊ Π»ΠΈΡ‚Π΅Ρ€Π°Π» 2), возвращаСтся Ρ‚ΠΎΠΆΠ΅ константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС компилятор Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ scale() Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.

Если происходит Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ scale() с Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ являСтся константным (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ i Ρ‚ΠΈΠΏΠ° int), Ρ‚ΠΎ возвращаСтся нСконстантноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ scale() Π² контСкстС, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅ΠΌ константного выраТСния, компилятор ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚, являСтся Π»ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ константным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Если это Π½Π΅ Ρ‚Π°ΠΊ, Ρ‚ΠΎ компилятор выдаст сообщСниС ΠΎΠ± ошибкС.

Ѐункция constexpr Π½Π΅ обязана Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

ΠŸΠΎΠΌΠ΅Ρ‰Π°ΠΉΡ‚Π΅ встраиваСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ constexpr Π² Ρ„Π°ΠΉΠ»Ρ‹ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°

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

УпраТнСния Ρ€Π°Π·Π΄Π΅Π»Π° 6.5.2

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.43. КакоС ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… объявлСний ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² Ρ„Π°ΠΉΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, Π° ΠΊΠ°ΠΊΠΎΠΉ β€” Π² тСкст Ρ„Π°ΠΉΠ»Π° исходного ΠΊΠΎΠ΄Π°? ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ ΠΏΠΎΡ‡Π΅ΠΌΡƒ.

(a) inline bool eq(const BigInt&, const BigInt&) {...}

(b) void putValues(int *arr, int size);

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.44. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ isShorter() ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 6.2.2 ΠΊΠ°ΠΊ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅ΠΌΡƒΡŽ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.45. ΠŸΠ΅Ρ€Π΅ΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, написанныС для ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΉ, ΠΈ Ρ€Π΅ΡˆΠΈΡ‚Π΅, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π»ΠΈ ΠΎΠ½ΠΈ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ встраиваСмыС. Если Π΄Π°, Ρ‚ΠΎ сдСлайтС это. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ встраиваСмыми.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.46. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ isShorter ΠΊΠ°ΠΊ constexpr? Если Π΄Π°, Ρ‚ΠΎ сдСлайтС это. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅Ρ‚.

6.5.3. ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅

Для условного выполнСния ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° программисты Π‘++ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Π·Π°Ρ‰ΠΈΡ‚Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° (см. Ρ€Π°Π·Π΄Π΅Π» 2.6.3). ИдСя Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Когда ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½ΠΎ ΠΈ Π³ΠΎΡ‚ΠΎΠ²ΠΎ ΠΊ выпуску, ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ использованиС Π΄Π²ΡƒΡ… срСдств прСпроцСссора: assert ΠΈ NDEBUG.

ΠœΠ°ΠΊΡ€ΠΎΡ прСпроцСссора assert

ΠœΠ°ΠΊΡ€ΠΎΡ assert β€” это макрос прСпроцСссора (preprocessor macro). ΠœΠ°ΠΊΡ€ΠΎΡ прСпроцСссора β€” это пСрСмСнная прСпроцСссора, Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ ΠΊΠ°ΠΊ встраиваСмая функция. ΠœΠ°ΠΊΡ€ΠΎΡ assert ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ ΠΊΠ°ΠΊ условиС:

assert(Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅);

Если Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выраТСния лоТь (Ρ‚.Π΅. Π½ΡƒΠ»ΡŒ), Ρ‚ΠΎ макрос assert Π²Ρ‹Π΄Π°Π΅Ρ‚ сообщСниС ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Если Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выраТСния β€” истина (Ρ‚.Π΅. ΠΎΠ½ ΠΎΡ‚Π»ΠΈΡ‡Π΅Π½ ΠΎΡ‚ нуля), Ρ‚ΠΎ макрос assert Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ.

ДСйствиС макроса прСпроцСссора ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π²Ρ‹Π·ΠΎΠ²Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠœΠ°ΠΊΡ€ΠΎΡ assert ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΊ условиС.

ΠœΠ°ΠΊΡ€ΠΎΡ assert ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ cassert. Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, относящиСся ΠΊ прСпроцСссору ΠΈΠΌΠ΅Π½Π° ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ прСпроцСссор, Π° Π½Π΅ компилятор (см. Ρ€Π°Π·Π΄Π΅Π» 2.3.2). Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‚Π°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСпосрСдствСнно, Π±Π΅Π· объявлСния using. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ имя assert, Π° Π½Π΅ std::assert, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, для Π½Π΅Π³ΠΎ Π½Π΅ прСдоставляСтся объявлСниС using.

ΠœΠ°ΠΊΡ€ΠΎΡ assert Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ "нСдопустимых" условий. НапримСр, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Π²ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ тСкста ΠΌΠΎΠ³Π»Π° Π±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ всС Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ слова Π΄Π»ΠΈΠ½Π½Π΅Π΅ Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ значСния. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠ³Π»Π° Π±Ρ‹ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€:

assert(word.size() > threshold);

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ прСпроцСссора NDEBUG

ПовСдСниС макроса assert зависит ΠΎΡ‚ состояния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ прСпроцСссора NDEBUG. Если пСрСмСнная NDEBUG ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, макрос assert Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ пСрСмСнная NDEBUG Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, поэтому ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ макрос assert выполняСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ.

ΠžΡ‚Π»Π°Π΄ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ "Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ", прСдоставив Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #define, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ NDEBUG. Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ компиляторов прСдоставляСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ прСпроцСссора: