C++ de los fundamentos al dominio — Lección 23
Completar el proyecto final con compilación, pruebas, sanitizers y profiling
Los artículos de este blog se han escrito con fines didácticos. Pueden contener errores; contrasta la información con el compilador y la biblioteca estándar de tu plataforma.
El dominio no consiste en llenar el código de sintaxis avanzada, sino en explicar requisitos, vida útil, fallos y rendimiento con evidencia reproducible. El proyecto final integra la serie en un sistema asíncrono de streaming de recursos.
Contrato del Capstone
request → deduplicar → leer archivo → decode → GPU upload → cache
│ │ │
cancelar/error worker pool límite main-thread
- Las peticiones concurrentes de una misma clave comparten una operación.
- Si todos los interesados cancelan, se detiene el trabajo innecesario.
- File bytes, decode buffers y objetos GPU tienen propietarios claros.
- Ningún callback toca estado destruido tras cerrar workers.
- Se conserva la categoría del error y si admite reintento.
- Tiempo, memoria y asignaciones se miden con una carga representativa.
Dirigir dependencias hacia dentro
include/streaming/ contratos públicos, handles, errores
src/core/ máquina de estados y deduplicación
src/io/ adapter del sistema de archivos
src/decode/ adapter del decoder de imagen
src/gpu/ adapter del render thread
tests/ pruebas unitarias, integración y races
benchmarks/ workloads reproducibles
El núcleo no depende directamente de la API gráfica ni del sistema de archivos. Recibe interfaces pequeñas o tipos restringidos; las pruebas inyectan fakes deterministas.
Las funciones inline y plantillas de headers deben tener definiciones equivalentes en todas las translation units. Cambiar el layout público o el orden virtual puede romper la ABI, por lo que una shared library necesita política de versión y rebuild.
Reproducir fallos con herramientas
-fsanitize=address,undefined -fno-omit-frame-pointer
-fsanitize=thread
AddressSanitizer detecta muchos errores de vida y límites, UndefinedBehaviorSanitizer informa de varias clases de undefined behavior y ThreadSanitizer ayuda con data races. ASan y TSan suelen usar builds separados y el soporte varía.
Las pruebas obligatorias incluyen archivos vacíos o corruptos, carrera entre cancelación y finalización, peticiones duplicadas, cierre de workers y agotamiento del allocator. Usa barriers, fake executors y callbacks controlados en vez de sleeps.
El profile comprueba una hipótesis
Registra CPU, OS, compilador y flags, entrada, comando, repeticiones y resultados brutos. Examina p50/p95 latency, peak memory, asignaciones y throughput, no solo una media.
Elige un cuello medido, cambia un factor y compara de nuevo corrección y recursos. std::move, allocators propios y estructuras lock-free necesitan evidencia.
Criterios de finalización
- Explicar propiedad y thread affinity con un diagrama.
- Dar a cada operación rutas de éxito, fallo, cancelación y cierre.
- Probar races y errores de vida con tests y Sanitizers.
- Reproducir configure, build y test desde un entorno limpio.
- Registrar medidas, alternativas descartadas y límites en ADRs.
Dominar C++ no significa memorizar cada rincón. Significa expresar la vida de valores y recursos mediante tipos, controlar límites de concurrencia y fallo, y revisar el diseño con evidencia de compiladores, pruebas, Sanitizers y profilers.