PÀrast aasta arendust avaldati vÀljaandmine vaba komplekti kompilaatoritest GCC 16.1, esimene mÀrkimisvÀÀrne vÀljaanne uues haruversioonis GCC 16.x. Vastavalt vÀljaannete nummerdamise skeemile, versioon 16.0 kasutati arenduse kÀigus, enne GCC 16.1 vÀljalaset mahasÔidu haru GCC 17.0, mille alusel koostatakse jÀrgmine mÀrkimisvÀÀrne vÀljaanne GCC 17.1.
Peamised muudatused:
- C++ keele vaike reĆŸiim on lĂŒlitatud C++20 (GNU C++20, -std=gnu++20) asemel, mis varem pakuti C++17. C++20 rakendus standardraamatukogus on kuulutatud stabiilseks.
- Koosseisu on lisatud katsetav esikĂŒlg ga68 Algol 68 programmeerimiskeele programmide kompileerimiseks.
- Lisatud on vÔimalus esitada diagnoosi teavet HTML formaadis. Laiendatud teavet programmi tÀitmise kohta, mis sisaldub diagnoosi vÀljundis SARIF, mis pÔhineb JSON-il (toetust «-fdiagnostics-format=json» on lÔpetatud).
- Suurendatud optimeerimist sidumisetapis (LTO, Link-Time Optimization). Lisatud valik «-flto-toplevel-asm-heuristics», mis sisaldab heuristikat koodi optimeerimise paremaks tegemiseks, kus kasutatakse koosseisu. Spekulatiivse devirtualiseerimise tehnika (-fdevirtualize-speculatively) ei ole enam piiratud virtuaalsete meetodite transformeerimisega ja seda saab rakendada kÔikide kaudsete funktsioonikutsumiste, nÀiteks vihikute kaudu, otsekutsumiste transformeerimise korral.
- Rakendatud on silmade vektorisatsioon, mille puhul kompilatsiooni kĂ€igus on teadmata iteratsioonide arv. Suurenenud on tsĂŒkli ennetĂ€htaegse vĂ€ljapaneku töötlemise tĂ”husus (nĂ€iteks lĂ€bi break).
- Lisatud katsetav tugi paljudele vÔimalusi just kinnitatud standardile C++26. NÀiteks on rakendatud:
- Refleksioon (Reflection, «-freflection»), mis vĂ”imaldab jĂ€lgida ja muuta programmi elemente kompilatsiooni etapis. Lisatud on uued operaatorid «^^ (open-std.org)» grammatiline konstruktsiooniteabe saamiseks ja «[:âŠ:]» tagasikujundamise teostamiseks. Saadud teabe muundamise ja töötlemise jaoks on pakutud teek std::meta ning saadaval on vĂ”imalused konstantidega arvutamiseks.
- Lepinguprogrammeerimine (Contracts), vĂ”imaldades mÀÀrata liideste formaalseid spetsiifikatsioone kolme uue operaatori abil: pre (eeltingimus), post (pĂ€rast tingimus) ja contract_assert (vĂ€idete kontroll). Operaator âpreâ mÀÀratleb eeltingimused, mis peavad olema tĂ€idetud enne kutsumist (sisendi kontroll); âpostâ â tingimused, mis peavad kehtima pĂ€rast tĂ€itmist (vĂ€ljundi nĂ”uded); contract_assert â erandite tekkimise tingimused. See vĂ”imalus ilmub GCC 16-sse.
- Operaator âtemplate forâ elementide, nagu parameetrite paketid, tuple'ide sarnased objektid ja refleksiooni (metaobjektide) tulemused, lĂ€bimiseks kompileerimise ajal tavalise tsĂŒkli stiilis. Kui âtemplate forâ kĂ€itatakse, avatakse tsĂŒkli keha iga elemendi jaoks ja iga iteratsioonitöötlus toimub eraldi nĂ€htavuses, kus jĂ€rjestuse element, millest tsĂŒkkel iteratsioonib, on iga iteratsiooni jaoks konstant ja vĂ”ib osaleda konstantsetes vĂ€ljendites (constexpr). Refleksiooni kontekstis vĂ”ib âtemplate forâ rakendada klasside vĂ”i loendite omaduste lĂ€bimiseks.
- Raamatukogu std::simd andmete töötlemise operatsiooni paralleelse tĂ€ideviimise vĂ”imaldamiseks SIMD kĂ€skude kogumite abil, nagu AVX-512 ja NEON, kasutades C++ standardtĂŒĂŒpe.
- Raamatukogud std::inplace_vector, std::optional<T&>, std::copyable_function, std::function_ref, std::indirect, std::polymorphic ja std::owner_equal.
- Rakendatud on vĂ”imalused, mis on seotud standardiga C++23, nĂ€iteks selge objektide elutsĂŒkli haldamine ja toetamine diagnostikateate sĂŒmbolite kodeerimise mÀÀramine.
- Standardi toetamist on laiendatud C23 (opennet.ru), nĂ€iteks on rakendatud vĂ”imalus kasutada âcounted_byâ atribuuti pointerite kasutamise Ă”iguse kontrollimiseks.
- JĂ€tkatakse standardite rakendamine OpenMP 5.0, 5.1, 5.2 ja 6.0 (Open Multi-Processing), mis mÀÀratleb API-d ja viise, kuidas kasutada paralleelse programmeerimise meetodeid mitme tuumaga ja hĂŒbriidsetes (CPU+GPU/DSP) sĂŒsteemides, kus on jagatud mĂ€lu ja vektorkĂ€rpimise (SIMD) plokid. Parandatud paralleelse programmeerimise spetsiifikate rakendamine OpenACC 3.0, 3.3 ja 3.4, mis mÀÀratleb meetodid operatsioonide (offloading) ĂŒlekandmiseks GPU-dele ja spetsialiseeritud protsessoritele, nagu NVIDIA PTX.
- X86 arhitektuuri taustteenusesse on lisatud AMD protsessorite tugi Zen6 mikroarhitektuuri pÔhjal (-march=znver6), samuti Intel Wildcat Lake (-march=wildcatlake) ja Nova Lake (-march=novalake) protsessorite tugi.
- AMD Radeon (GCN) koodi genereerimise taustsĂŒsteemis on rakendatud AMD Instinct MI300 (gfx942) kiirendite tugi.
- RISC-V, ARM, S/390 ja LoongArch arhitektuuride jaoks on rakendatud "_BitInt (N)" tĂŒĂŒbi tugi, et mÀÀratleda tĂ€isarvud mÀÀratud bittide arvuga.
Allikas: linux.org.ru
