Po roku rozwoju, Nowa wersja zestawu kompilatorów GCC 11.1 została wydana, pierwsze znaczące wydanie w nowej gałęzi GCC 11.x. Zgodnie z nowym schematem numerowania wersji, wersja 11.0 była używana podczas rozwoju, a krótko przed wydaniem GCC 11.1 gałąź GCC 12.0 została już rozwidlona, aby utworzyć następną główną wersję GCC 12.1.
GCC 11.1 wyróżnia się przejściem do domyślnego formatu pliku debugowania DWARF 5, domyślne włączenie standardu C ++ 17 („-std = gnu ++ 17”), znaczące ulepszenia zgodności ze standardem C ++ 20, eksperymentalne wsparcie dla C ++ 23, ulepszenia związane z przyszłym standardem język C (C2x), nowe optymalizacje wydajności.
GCC 11.1 Główne nowe funkcje
Domyślny tryb języka C ++ został zmieniony tak, aby używał standardu C ++ 17, zamiast wcześniej proponowanego C ++ 14. Możliwe jest selektywne wyłączenie nowego zachowania C ++ 17 podczas przetwarzania szablonów, które używają innych szablonów jako parametru (-fno-new-ttp-matching).
Dodano obsługę akceleracji sprzętowej narzędzia AddressSanitizer, które pozwala określić fakty dotyczące uzyskiwania dostępu do zwolnionych obszarów pamięci, przekraczania limitów przydzielonego bufora i niektórych innych typów błędów podczas pracy z pamięcią. Akceleracja sprzętowa jest obecnie dostępna tylko dla architektury AArch64 i koncentruje się na jej wykorzystaniu podczas kompilowania jądra Linuksa.
Kolejną prezentowaną nowością są optymalizacje i ulepszenia między procedurami, ponieważ dodano nową przepustkę IPA-modref (-fipa-modref) do śledzenia efektów ubocznych w wywołaniach funkcji i poprawiania dokładności analizy. Poza tym również a ulepszona implementacja przepustki IPA-ICF (-fipa-icf), co zmniejsza zużycie pamięci kompilacji i zwiększa liczbę ujednoliconych funkcji, dla których łączone są identyczne bloki kodu.
El silnik optymalizacji sterowany profilami (PGO), ulepszony tryb „-fprofile-wartości” śledząc więcej parametrów dla połączeń pośrednich.
również Zwrócono uwagę na dalsze wdrażanie standardu OpenMP 5.0 (Open Multi-Processing), w którym dodano początkową obsługę dyrektywy przypisania i możliwość używania niejednolitych pętli w kompilacjach OpenMP. Obsługiwana jest teraz zmienna środowiskowa OMP_TARGET_OFFLOAD.
Udoskonalono implementację specyfikacji programowania równoległego OpenACC 2.6 dla języków C, C ++ i Fortran, która definiuje narzędzia do przenoszenia operacji na GPU i wyspecjalizowane procesory, takie jak NVIDIA PTX.
Dla języków z rodziny C zaimplementowano nowy atrybut „no_stack_protector”, zaprojektowany do oznaczania funkcji, dla których ochrona stosu nie powinna być włączona („-fstack-protector”). Atrybut „malloc” został rozszerzony o obsługę identyfikowania par wywołań do przydzielenia i zwolnienia pamięci, który jest używany w parserze statycznym do wykrywania typowych błędów pamięci (wycieki pamięci, użycie po zwolnieniu, podwójne wywołania funkcji zwolnienia itp.) i ostrzeżeń kompilatora „-Wmismatched-dealloc”, „-Wmismatched- new-delete” i „ -Wfree-nonheap-object ”zgłaszanie niespójnych operacji zwalniania i zwalniania alokacji.
Podczas generowania informacji debugowania domyślnie używany jest format DWARF 5, który w porównaniu z poprzednimi wersjami umożliwia generowanie danych debugowania, które są o 25% bardziej zwarte. Pełna obsługa DWARF 5 wymaga binutils w wersji co najmniej 2.35.2.
Rozszerzone możliwości trybu ThreadSanitizer (-fsanitize = wątek), ponieważ take dodaje obsługę alternatywnych środowisk wykonawczych i środowisk, a także obsługę narzędzia do debugowania Kernel Concurrency Sanitizer (KCSAN) w celu dynamicznego wykrywania warunków wyścigu w jądrze Linuksa. Dodano nowe opcje „–param tsan-wyrózniaj-volatile” i „–param tsan-instrument-func-entry-exit”.
Wektoryzator zapewnia rozliczanie całej zawartości funkcji i dodatkowe przetwarzanie możliwości związanych z przecięciami i odniesieniami do poprzednich bloków w schemacie blokowym sterowania (CFG).
Optymalizator ma możliwość konwersji serii operacji warunkowych na wyrażenie zmiany, w którym porównywana jest ta sama zmienna. W przyszłości wyrażenie zmiany będzie można zakodować za pomocą instrukcji testu bitowego (aby sterować tą konwersją, dodano opcję „-fbit-tests”).
W przypadku C ++ zaimplementowano część zmian i innowacji zaproponowanych w standardzie C ++ 20, w tym funkcje wirtualne „consteval virtual”, pseudo-niszczyciele do kończenia cyklu życia obiektów, wykorzystanie klasy enum i obliczanie rozmiar tablicy w wyrażeniu „nowy”.
Jeśli chcesz dowiedzieć się więcej na ten temat, możesz sprawdzić szczegóły w poniższy link.