C++26: Un Gran Salto para las Funciones de Biblioteca Estándar en Tiempo de Compilación

2025-05-01

C++26 está a punto de revolucionar la programación en tiempo de compilación con un gran aumento en el soporte constexpr en la biblioteca estándar. Varias propuestas (P2562R1, P1383R2, P3074R7, P3372R2, P3508R0, P3369R0) incorporan algoritmos de ordenación estable, funciones y , reglas de unión mejoradas, casi todos los contenedores y adaptadores, y algoritmos de memoria especializados en la categoría constexpr. Esto mejora significativamente las capacidades de tiempo de compilación, permitiendo, por ejemplo, la ordenación en tiempo de compilación de contenedores constexpr. Aunque std::hive y std::hash siguen excluidos debido a limitaciones, C++26 promete una expansión dramática de las posibilidades de programación en tiempo de compilación.

Leer más

C++26: Un salto gigante para constexpr

2025-04-23

C++26 está listo para revolucionar constexpr. Las características futuras incluyen conversiones constexpr desde void*, permitiendo una manipulación de memoria más flexible en tiempo de compilación; constexpr placement new, permitiendo la colocación de objetos dentro de expresiones constantes; y enlaces estructurados constexpr, trayendo enlaces estructurados en tiempo de compilación. Estas mejoras expanden drásticamente el alcance de constexpr y empoderan a la biblioteca estándar con capacidades mejoradas en tiempo de compilación.

Leer más

Rendimiento de Ranges en C++20: Un giro sorprendente

2025-04-19

El autor reemplazó un bucle simple por `std::ranges::transform` en un proyecto C++, esperando un aumento de rendimiento. Las pruebas revelaron un resultado sorprendente: un bucle simple optimizado (usando `emplace_back` y `reserve`) resultó ser un 20% más rápido en Clang y un 10% más rápido en GCC. El artículo compara diferentes enfoques, destacando el rendimiento y la legibilidad del código. La conclusión: priorice la legibilidad a menos que el rendimiento sea un cuello de botella crítico.

Leer más
Desarrollo

C++26: Resumen de Funciones Eliminadas y Obsoletas

2025-03-20

C++26 está eliminando o marcando como obsoletas varias funciones. Esto incluye la eliminación completa del `typedef` `std::allocator` obsoleto en C++20, y la sobrecarga sin argumentos de `std::basic_string::reserve()`; la eliminación de las utilidades de conversión Unicode obsoletas y de `std::strtok`; la eliminación de los antiguos `strstreams` y de las APIs de acceso atómico `std::shared_ptr`; y la eliminación de `std::wstring_convert`. Además, `std::is_trivial` está obsoleto, y se sugiere el uso de alternativas `is_trivially_XXX` más precisas; y `std::memory_order::consume` está obsoleto debido a una especificación insatisfactoria y dificultades de implementación. Estas eliminaciones y obsolecencias tienen como objetivo mejorar la seguridad y la eficiencia del lenguaje, y limpiar las funcionalidades desactualizadas.

Leer más

C++26: La indexación de paquetes simplifica la extracción de elementos

2025-01-24

Si bien C++11 introdujo paquetes de parámetros, la extracción de elementos específicos seguía siendo engorrosa. C++26, gracias a la propuesta P2662R3, introduce la indexación de paquetes, permitiendo el acceso directo a los elementos del paquete utilizando el operador de subíndice, por ejemplo, `T...[0]` para el primer elemento. Esto da como resultado un código más limpio, legible y con mejor rendimiento en tiempo de compilación. Aunque la indexación negativa y el corte aún no son compatibles, la característica ya es bastante útil y mejora significativamente el desarrollo en C++.

Leer más

C++26: Llega el marcador de posición sin nombre '_'

2025-01-11

C++26 introduce una característica innovadora: el marcador de posición sin nombre '_'. Resuelve una molestia de larga data en C++: el manejo de variables no utilizadas. Anteriormente, los desarrolladores necesitaban `[[maybe_unused]]` o `std::ignore` para evitar advertencias del compilador, especialmente con enlaces estructurados. El marcador de posición '_' puede declararse varias veces sin conflicto e implícitamente tiene el atributo `[[maybe_unused]]`, simplificando el código y mejorando la legibilidad. Esta característica ya está implementada en GCC 14 y Clang 18.

Leer más