Π‘Π»Π΅Π΄ ΡΠ΅ΡΡ ΠΌΠ΅ΡΠ΅ΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ ΡΠ΅Π»ΠΈΠ·ΡΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° LLVM 21.1.0, ΠΊΠΎΠΉΡΠΎ ΡΠ°Π·Π²ΠΈΠ²Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ (ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠΈ, ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΎΡΠΈ ΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΈ Π½Π° ΠΊΠΎΠ΄), ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π² ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π΅Π½ Π±ΠΈΡΠΊΠΎΠ΄ Π½Π° RISC-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ (Π½ΠΈΡΠΊΠ° Π½ΠΈΠ²ΠΎ Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° Ρ ΠΌΠ½ΠΎΠ³ΠΎΡΡΠ΅ΠΏΠ΅Π½Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ). ΠΠ΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈΡΡ ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½ Π² ΠΌΠ°ΡΠΈΠ½Π΅Π½ ΠΊΠΎΠ΄ Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠ΅Π»Π΅Π²Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ ΠΎΡ JIT ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠ°ΡΠΈΠ½Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°. ΠΠ° Π±Π°Π·Π°ΡΠ° Π½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ LLVM ΠΏΡΠΎΠ΅ΠΊΡΡΡ ΡΠ°Π·Π²ΠΈΠ²Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ° Clang, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈ Π΅Π·ΠΈΡΠΈ C, C++ ΠΈ Objective-C. ΠΠ°ΠΏΠΎΡΠ²Π°ΠΉΠΊΠΈ ΠΎΡ ΠΊΠ»ΠΎΠ½ 18.x, ΠΏΡΠΎΠ΅ΠΊΡΡΡ ΠΏΡΠ΅ΠΌΠΈΠ½Π° Π½Π° Π½ΠΎΠ²Π° ΡΡ Π΅ΠΌΠ° Π·Π° ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π²Π°Π½Π΅ Π½Π° Π²Π΅ΡΡΠΈΠΈ, ΡΡΠ³Π»Π°ΡΠ½ΠΎ ΠΊΠΎΡΡΠΎ Π½ΡΠ»Π΅Π²ΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ (βN.0β) ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°, Π° ΠΏΡΡΠ²Π°ΡΠ° ΡΡΠ°Π±ΠΈΠ»Π½Π° Π²Π΅ΡΡΠΈΡ ΠΏΠΎΠ»ΡΡΠ°Π²Π° Π½ΠΎΠΌΠ΅Ρ βN.1β.
Π‘ΡΠ΅Π΄ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° Π² Clang 21:
- ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΡΡΡ C++:
- ΠΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Π½Π° GCC, Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΈ ΠΈΠ·ΡΠ°Π·ΠΈ Π² Π°ΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΠΈ Π²ΠΌΡΠΊΠ²Π°Π½ΠΈΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ΠΈ ΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π°ΡΠ° βasmβ: int foo() { asm((std::string_view(βnopβ)) ::: (std::string_view(βmemoryβ))); }
- ΠΠΎΠ±Π°Π²Π΅Π½ΠΈ ΡΠ° ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠΈ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈΡΠ΅ βnewβ ΠΈ βdeleteβ, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° βstd::type_identityβ, ΡΡΠ΅Π· ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠΎΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΡΠΈΠΏΠ° Π½Π° ΠΎΠ±Π΅ΠΊΡΠ°, Π·Π° ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π·Π°Π΄Π΅Π»Ρ ΠΈΠ»ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π° ΠΏΠ°ΠΌΠ΅Ρ.
- ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° Π»Π°ΠΌΠ±Π΄Π° ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ Π·Π°Ρ Π²Π°ΡΠ°Ρ ΡΡΡΡΠΊΡΡΡΠΈΡΠ°Π½ΠΈ ΡΠ²ΡΡΠ·Π²Π°Π½ΠΈΡ (structured binding), Π½Π° Π΅ΡΠ°ΠΏ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ΅Π½ ΠΈΠ·ΡΠ°Π·.
- ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ Π±ΡΠ΄Π΅ΡΠΈΡ ΡΡΠ°Π½Π΄Π°ΡΡ C++2c (C++26):
- Π ΡΡΡΡΠΊΡΡΡΠΈΡΠ°Π½ΠΈ ΡΠ²ΡΡΠ·Π²Π°Π½ΠΈΡ Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° β...β Π·Π° ΡΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΊΠΎΠΈΡΠΎ Π·Π°Ρ Π²Π°ΡΠ°Ρ ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΎΡ ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π°Π½Π°ΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ. auto [x,y,z] = f(); // Π² ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ x, y, z ΡΠ΅ Π±ΡΠ΄Π°Ρ Π·Π°ΠΏΠΈΡΠ°Π½ΠΈ ΡΡΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ°, Π²ΡΡΠ½Π°ΡΠΈ ΠΎΡ f(). auto [β¦xs] = f(); // Π² ΠΏΠ°ΠΊΠ΅ΡΠ° xs ΡΠ΅ Π±ΡΠ΄Π°Ρ Π·Π°ΠΏΠΈΡΠ°Π½ΠΈ Π²ΡΠΈΡΠΊΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ, Π²ΡΡΠ½Π°ΡΠΈ ΠΎΡ f(). auto [x, ...rest] = f(); // Π x ΡΠ΅ Π±ΡΠ΄Π΅ Π·Π°ΠΏΠΈΡΠ°Π½ ΠΏΡΡΠ²ΠΈΡΡ Π΅Π»Π΅ΠΌΠ΅Π½Ρ, Π° Π² rest β ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅. auto [x, y, ...rest] = f(); // Π x ΡΠ΅ Π±ΡΠ΄Π΅ Π·Π°ΠΏΠΈΡΠ°Π½ ΠΏΡΡΠ²ΠΈΡΡ Π΅Π»Π΅ΠΌΠ΅Π½Ρ, Π² y β Π²ΡΠΎΡΠΈΡΡ, Π° Π² rest β ΡΡΠ΅ΡΠΈΡΡ. auto [x, ...rest, z] = f(); // Π² x β ΠΏΡΡΠ²ΠΈΡΡ, Π² rest β Π²ΡΠΎΡΠΈΡΡ, Π² z β ΡΡΠ΅ΡΠΈΡΡ.
- ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° Β«ΡΡΠΈΠ²ΠΈΠ°Π»Π½Π°ΡΠ° ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ²Π°Π½Π΅Β» (Trivial Relocatability), ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠ΅ΠΌeΡΡΠ²Π°Π½ΠΈΡΡΠ° Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ ΠΎΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΡΠΈΠΏ ΡΡΠ΅Π· ΠΊΠ»ΠΎΠ½ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈΠΌ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π±Π΅Π· ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΈ ΠΈΠ»ΠΈ Π΄Π΅ΡΡΡΡΠΊΡΠΎΡΠΈ. ΠΠ° ΠΊΠ»Π°ΡΠΎΠ²Π΅ΡΠ΅ ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΡΠ° memberwise_trivially_relocatable ΠΈ memberwise_replaceable, Π° Π·Π° Π½ΠΈΡΠΊΠΎΡΡΠ΅Π΄Π½ΠΎ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΎΠ±Π΅ΠΊΡΠ° ΡΠ° Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ trivially_relocate_at ΠΈ trivially_relocate.
- ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° ΡΡΡΡΠΊΡΡΡΠΈΡΠ°Π½ΠΎ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ (structured binding) ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈΡΠ΅ if ΠΈ switch.
- Π Π΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° main ΠΊΡΠΌ Π³Π»ΠΎΠ±Π°Π»Π΅Π½ ΠΌΠΎΠ΄ΡΠ» ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° main Π² ΠΈΠΌΠ΅Π½ΡΠ²Π°Π½ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ.
- ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π°Ρ Π·Π° Π±ΡΠ΄Π΅ΡΠΈΡ ΡΡΠ°Π½Π΄Π°ΡΡ C2y:
- ΠΡΡΡΡΠ°Π½Π΅Π½ΠΎ Π΅ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΈΠ·ΡΠ°Π·ΠΈ Ρ ΡΠΈΠΏ void Π² Π½ΡΠΊΠΎΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Β«(void)(void)1;Β».
- Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΎ Π΅ ΡΠ°ΠΉΠ»ΡΡ Ρ ΠΈΠ·Ρ ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ Π΄Π° Π½Π΅ Π·Π°Π²ΡΡΡΠ²Π° ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Π° Π·Π° Π½ΠΎΠ² ΡΠ΅Π΄.
- ΠΠΎΠ±Π°Π²Π΅Π½ΠΈ ΡΠ° Π½ΠΎΠ²ΠΈ ΠΏΡΠ΅ΡΠΈΠΊΡΠΈ Π·Π° ΠΎΡΠ΅ΠΌΠ΄Π΅ΡΠ΅ΡΠΈΡΠ½ΠΈ Π»ΠΈΡΠ΅ΡΠ°Π»ΠΈ β 0o ΠΈ 0O, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΎΡΠ΅ΠΌΠ΄Π΅ΡΠ΅ΡΠΈΡΠ½ΠΈ ΠΈ ΡΠ΅ΡΡΠ½Π°Π΄Π΅ΡΠ΅ΡΠΈΡΠ½ΠΈ escape-ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΠΈ Β«\o{β¦}Β» ΠΈ \x{β¦}. ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° ΠΎΡΠ΅ΠΌΠ΄Π΅ΡΠ΅ΡΠΈΡΠ½ΠΈ Π»ΠΈΡΠ΅ΡΠ°Π»ΠΈ 0xxx Π΅ ΠΎΠ±ΡΠ²Π΅Π½Π° Π·Π° ΠΎΡΡΠ°ΡΡΠ»Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Β«0o123Β» ΠΈ Β«\o{123}Β» Π²ΠΌΠ΅ΡΡΠΎ Β«0123Β».
- ΠΠΎΠ±Π°Π²Π΅Π½ Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡΡ Β«_CountofΒ» Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π±ΡΠΎΡ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ΅ Π² ΠΌΠ°ΡΠΈΠ². Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ Π·Π°Π³Π»Π°Π²Π΅Π½ ΡΠ°ΠΉΠ» stdcountof.h, ΠΊΠΎΠΉΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ Π²Π΅ΡΡΠΈΡ Π½Π° ΠΌΠ°ΠΊΡΠΎΡΠ° Β«countofΒ», ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ ΡΡΠ΅Π· Β«_CountofΒ».
- ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ° C23 ΠΏΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ° C:
- Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΎ Π΅ ΠΏΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ΡΠΎ Π½Π° tag-ΡΠΈΠΏΠΎΠ²Π΅ (struct, union, enum) Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π΅Π΄ΠΈΠ½ Π±Π»ΠΎΠΊ Π½Π° ΡΡΠ°Π½ΡΠ»Π°ΡΠΈΡ, Π°ΠΊΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΈΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ° ΡΡΡΡΠΊΡΡΡΠ½ΠΎ Π΅ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΈ (ΡΡΡΠΈΡΡ Π±ΡΠΎΠΉ ΡΠ»Π΅Π½ΠΎΠ²Π΅, Π΅Π΄Π½Π°ΠΊΠ²ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ ΠΈ ΠΈΠΌΠ΅Π½Π° Π½Π° ΡΠ΅Π³ΠΎΠ²Π΅).
- ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½ΠΎ Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΏΠΈΡΡΡΠΈ Ρ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ² Π±ΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ (variadic). ΠΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ Π²Π°ΡΠΈΠ°ΡΠΈΠ²Π΅Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΠΈΠΏΠ°.
- ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠ° Ρ GCC Π²Π³ΡΠ°Π΄Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Β«__builtin_c23_va_start()Β», ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ°ΡΠ° Π·Π° ΠΌΠ°ΠΊΡΠΎΡΠ° va_start() Π² ΡΠ΅ΠΆΠΈΠΌ C23.
- Π ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Ρ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ° MSVC Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡΡ inline ΠΏΡΠΈ Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΈΠΏ ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠ΅Π· typedef, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Β«typedef int inline Foo(int);Β»
- Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΡΡ Β«restrictΒ» Π·Π° ΡΠΈΠΏΠΎΠ²Π΅ ΠΌΠ°ΡΠΈΠ²ΠΈ Ρ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ-ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ.
- ΠΠΎΠ²ΠΈ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ°:
- Β«-Wdefault-const-init-varΒ» ΠΈ Β«-Wdefault-const-init-fieldΒ» β ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΈ ΠΏΠΎΠ»Π΅ΡΠ°, ΠΌΠ°ΡΠΊΠΈΡΠ°Π½ΠΈ Ρ const, Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ Π±Π΅Π· ΡΠ²Π½Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ.
- Β«-Wimplicit-void-ptr-castΒ» β ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΏΡΠΈ Π½Π΅ΡΠ²Π½ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½Π΅ ΠΎΡ ΡΠΈΠΏΠ° Β«void*Β» Π² Π΄ΡΡΠ³ ΡΠΈΠΏ ΡΠΊΠ°Π·Π°ΡΠ΅Π».
- Β«-Wc++-keywordΒ» β ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΏΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠ»ΡΡΠΎΠ²ΠΈ Π΄ΡΠΌΠΈ Β«C++Β» ΠΊΠ°ΡΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΈ Π² Β«CΒ».
- Β«-Wc++-hidden-declΒ» β ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΈΠΏΠΎΠ²Π΅ΡΠ΅ ΡΠ°Π³ΠΎΠ²Π΅, Π²ΠΈΠ΄ΠΈΠΌΠΈ Π² Β«CΒ», Π½ΠΎ Π½Π΅ Π²ΠΈΠ΄ΠΈΠΌΠΈ Π² Β«C++Β» ΠΏΠΎΡΠ°Π΄ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±Ρ Π²Π°ΡΠ°.
- Β«-Wimplicit-int-enum-castΒ» β ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ° Π½Π΅ΡΠ²Π½ΠΈΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½ΠΈΡ Π² C ΠΊΠΎΠ΄ ΠΎΡ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Π² ΡΠΈΠΏΠΎΠ²Π΅ ΠΈΠ·Π±ΡΠΎΡΠ²Π°Π½Π΅, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ Ρ Β«C++Β».
- Β«-Wtentative-definition-compatΒ» β Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° Π½Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π² Β«CΒ», Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ, Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ Ρ Β«C++Β».
- Β«-Wunterminated-string-initializationΒ» ΠΈ Β«-Wc++-unterminated-string-initializationΒ» β ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ° ΡΠΈΡΡΠ°ΡΠΈΠΈ Π½Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΡ ΡΡΡΠΈΠ½Π³ΠΎΠ²ΠΈ Π»ΠΈΡΠ΅ΡΠ°Π»ΠΈ, Π² ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π·Π°Π΄ΡΡΠΆΠΈ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π» ΡΡΡ Π½ΡΠ»Π΅Π² ΠΊΠΎΠ΄. ΠΠ° Π΅ΡΠΈΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΠ»Π΅ΡΠ° ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π² ΠΊΠΎΠ΄Π° Π½Π° C, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π΅Π½ Π½ΡΠ»Π΅Π² ΡΠΈΠΌΠ²ΠΎΠ», Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ Π°ΡΡΠΈΠ±ΡΡ Β«nonstringΒ».
- Β«-Wjump-misses-initΒ» β Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° Π½Π° ΠΏΡΠ΅Ρ ΠΎΠ΄ΠΈ ΡΡΠ΅Π· goto ΠΈΠ»ΠΈ switch/case, ΠΊΠΎΠΈΡΠΎ ΠΏΡΠΎΠΏΡΡΠΊΠ°Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°.
- Β«-Wundef-trueΒ» β ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π°Π²Π° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Β«trueΒ» Π² ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° C Π±Π΅Π· ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅.
- Β«-WnrvoΒ» β Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° Π½Π° ΠΏΡΠΎΠΏΡΡΠ½Π°ΡΠΈ NRVO (Named Return Value Optimization).
- ΠΠΎΠ²ΠΈ ΡΠ»Π°Π³ΠΎΠ²Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ°:
- Β«-fprofile-continuousΒ» β Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠ° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΡΠΈΠ»Π° Π² ΡΠ°ΠΉΠ».
- Β«-ftime-report-jsonΒ» β ΠΈΠ·Π²Π΅ΠΆΠ΄Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π² JSON ΡΠΎΡΠΌΠ°Ρ.
- Β«-ignore-pchΒ» β Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ΠΈ Π·Π°Π³Π»Π°Π²ΠΈΡ.
- Β«-fthinlto-distributorΒ» ΠΈ Β«-Xthinlto-distributorΒ» β Π·Π° ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° DTLTO (Integrated Distributed ThinLTO).
- Β«-static-libclosureΒ» β Π·Π° ΡΡΠ°ΡΠΈΡΠ½ΠΎ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° runtime ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ Blocks Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° Windows.
- Π Π°Π·ΡΠΈΡΠ΅Π½ΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π° Π·Π° Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° ΠΈ ΡΡΠ°ΡΠΈΡΠ΅Π½ Π°Π½Π°Π»ΠΈΠ·, Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ Π½ΠΎΠ²ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ (ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ ΡΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ°ΡΠ°).
- ΠΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈ Π±Π΅ΠΊΠ΅Π½Π΄ΠΈ Π·Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ ARM, Aarch64, AMDGPU, x86, RISC-V, LoongArch, MIPS ΠΈ PowerPC. Π Π±Π΅ΠΊΠ΅Π½Π΄Π° Π·Π° RISC-V Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° Π°ΡΠ΅ΠΌΠ±Π»Π΅ΡΠ° Π·Π° [[https://llvm.org/docs/RISCVUsage.html ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ Π½Π° Qualcomm uC, Andes ΠΈ SiFive.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru
