GCC 11.1 ya fue liberado, estas son sus novedades y cambios mas importantes
Después de un año de desarrollo, se lanzó la nueva versión de la suite de compiladores GCC 11.1, la primera versión significativa en la nueva rama GCC 11.x. Bajo el nuevo esquema de numeración de versiones, la versión 11.0 se usó durante el desarrollo, y poco antes del lanzamiento de GCC 11.1, ya se había bifurcado una rama de GCC 12.0 para formar la próxima versión principal de GCC 12.1.
GCC 11.1 destaca por la transición al formato de archivo de depuración predeterminado DWARF 5, la inclusión predeterminada del estándar C ++ 17 («-std = gnu ++ 17»), mejoras significativas en la compatibilidad con el estándar C ++ 20, soporte experimental para C ++ 23, mejoras relacionadas con el futuro estándar del lenguaje C (C2x), nuevas optimizaciones de rendimiento.
Principales novedades de GCC 11.1
El modo predeterminado para el lenguaje C++ se cambia para usar el estándar C++ 17, en lugar del C++ 14 propuesto anteriormente. Es posible deshabilitar selectivamente el nuevo comportamiento de C++ 17 al procesar plantillas que usan otras plantillas como parámetro (-fno-new-ttp-matching).
Se agregó soporte para la aceleración de hardware de la herramienta AddressSanitizer, que permite determinar los hechos de acceder a áreas de memoria liberadas, exceder los límites del búfer asignado y algunos otros tipos de errores al trabajar con memoria. Actualmente, la aceleración de hardware solo está disponible para la arquitectura AArch64 y se centra en su uso al compilar el kernel de Linux.
Otra novedad que se presenta son las optimizaciones y mejoradas entre procedimientos, pues se agregó un nuevo pase IPA-modref (-fipa-modref) para realizar un seguimiento de los efectos secundarios en las llamadas a funciones y mejorar la precisión del análisis. Además de también una implementación mejorada del pase IPA-ICF (-fipa-icf), que reduce el consumo de memoria de compilación y aumenta el número de funciones unificadas para las que se fusionan bloques idénticos de código.
El motor de optimización guiada por perfiles (PGO), se mejoró el modo «-fprofile-values» al realizar un seguimiento de más parámetros para llamadas indirectas.
También se destaca la implementación continua del estándar OpenMP 5.0 (Open Multi-Processing), en la cual se agregó soporte inicial para la directiva de asignación y la capacidad de usar bucles no uniformes en construcciones OpenMP. La variable de entorno OMP_TARGET_OFFLOAD ahora es compatible.
Se ha mejorado la implementación de la especificación de programación paralela OpenACC 2.6 proporcionada para los lenguajes C, C ++ y Fortran, que define herramientas para descargar operaciones a GPU y procesadores especializados como NVIDIA PTX.
Para los lenguajes de la familia C, se ha implementado un nuevo atributo «no_stack_protector», diseñado para marcar funciones para las que no se debe habilitar la protección de pila («-fstack-protector»). El atributo «malloc» se ha ampliado con soporte para identificar pares de llamadas para asignar y liberar memoria, que se usa en el analizador estático para detectar errores típicos de memoria (pérdidas de memoria, uso después de liberar, llamadas dobles a la libre función, etc.) y las advertencias del compilador «-Wmismatched-dealloc», «-Wmismatched-new-delete» y «-Wfree-nonheap-object» que informan sobre operaciones de desasignación y desasignación inconsistentes.
A la hora de generar información de depuración se utiliza por defecto el formato DWARF 5 que, en comparación con versiones anteriores, permite generar datos de depuración un 25% más compactos. El soporte completo de DWARF 5 requiere binutils al menos la versión 2.35.2.
Se mejoraron las capacidades del modo ThreadSanitizer (-fsanitize = thread), pues se agrega soporte para entornos y tiempos de ejecución alternativos, así como soporte para la herramienta de depuración Kernel Concurrency Sanitizer (KCSAN) para detectar dinámicamente condiciones de carrera dentro del kernel de Linux. Se agregaron nuevas opciones «–param tsan-distinguish-volatile» y «–param tsan-instrument-func-entry-exit».
El vectorizador proporciona la contabilidad de todo el contenido de la función y el procesamiento adicional de las capacidades asociadas con las intersecciones y referencias a bloques anteriores en el gráfico de flujo de control (CFG).
El optimizador tiene la capacidad de convertir una serie de operaciones condicionales en una expresión de cambio, en la que se compara la misma variable. En el futuro, la expresión de cambio se puede codificar utilizando instrucciones de prueba de bits (para controlar dicha conversión, se ha agregado la opción «-fbit-tests»).
Para C++, se han implementado una parte de los cambios e innovaciones propuestos en el estándar C++ 20, incluidas las funciones virtuales «consteval virtual», pseudodestructores para la terminación del ciclo de vida de los objetos, utilizando la clase enum y calculando el tamaño de una matriz en la expresión «nueva».
Si quieres conocer más al respecto, puedes consultar los detalles en el siguiente enlace.