← SEARCHABLE ARCHIVE
C / C++ · 2026-08-15

C++ de los fundamentos al dominio — Lección 23

Completar el proyecto final con compilación, pruebas, sanitizers y profiling

INTERACTIVE READING MODE →

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.