fmt
Dentro de fmt: entradas tipadas, borrado de tipos y búferes
Sigue fmt::format hasta vformat y su búfer, y examina cómo las vistas y el almacenamiento dinámico cambian las obligaciones de vida útil.
Qué aprenderás
- Sigue una llamada concreta
- Por qué borrar tipos después de comprobarlos
- La propiedad es el límite fácil de olvidar
Antes de empezar
- Valores, referencias, cadenas y destinos de construcción en C++
- Distinguir expectativas documentadas de resultados medidos
Traza comportamientos concretos de fmt y elige una integración con límites explícitos de salida, vida útil y verificación.
Conclusiones clave
- Traza format, vformat, formato al búfer y conversión a cadena en la revisión fijada.
- El borrado de tipos comparte implementación; no define un protocolo persistente.
- Las vistas y los almacenes dinámicos tienen propiedad dependiente del tipo.
Sigue una llamada concreta
En format.h, fmt::format recibe fmt::format_string con un paquete tipado y pasa el texto y un almacén vargs a vformat. En format-inl.h, vformat crea un memory_buffer, llama a detail::vformat_to y convierte el contenido en std::string. Es una ruta concreta del código, no un diagrama genérico de entrada, procesamiento y salida.
La ruta inferior tiene un caso especial para el formato exacto de dos caracteres {}. Otras cadenas pasan por parse_format_string y un format_handler con contextos de análisis y salida. Esa rama no demuestra que todos los formatos con un solo campo eviten el análisis: anchura, precisión, texto adicional y tipos propios pueden seguir otras rutas.
Por qué borrar tipos después de comprobarlos
La plantilla pública conoce los tipos y puede establecer un contrato de formato. Una implementación con borrado de tipos comparte más trabajo entre llamadores, en lugar de instanciar toda la implementación para cada combinación. La documentación muestra este patrón en un envoltorio de registros; basic_format_args guarda descriptores y valores o punteros en core.h.
El código incluye representaciones de argumentos empaquetadas y sin empaquetar, pero no son un formato de serialización estable para aplicaciones. No persistas su distribución de memoria ni conviertas un descriptor interno en protocolo entre versiones. En un límite de aplicación, conserva campos semánticos o una cadena terminada, no objetos privados de implementación.
La propiedad es el límite fácil de olvidar
fmt::format_args es una vista, y make_format_args recibe referencias a valores lvalue para evitar algunos problemas con temporales. Eso no convierte la vista en propietaria de todos los datos. Si aplazas el formato más allá de la vida del almacén o de sus cadenas, necesitas un diseño explícito de propiedad. Formatear ahora y registrar de forma asíncrona son casos distintos.
dynamic_format_arg_store proporciona almacenamiento para ciertos valores: cadenas y tipos propios pueden copiarse a nodos, mientras las vistas de cadena y los envoltorios de referencia siguen tomando prestados sus datos. La prueba strings_and_refs fijada lo muestra al modificar una matriz después de insertarla. Copia lo que deba sobrevivir a una cola o formatea antes de encolar.
Pasos de implementación
- 1
Localiza la plantilla pública de format.h.
- 2
Sigue vformat y la rama exacta {} de format-inl.h.
- 3
Lee los comentarios de almacenamiento y vida útil de core.h.
- 4
Prueba por separado copias, vistas y referencias explícitas.
Ejemplo para copiar
{"entry":"fmt::format","sharedImplementation":"vformat","destination":"memory_buffer then std::string","exactFastPath":"{}","format_argsOwnsInputs":false,"dynamicStoreCopiesStringViewsBackingData":false}Preguntas frecuentes
¿fmt::format_args posee de forma segura los datos encolados?
No. Es una vista; el almacén y los datos prestados deben seguir válidos durante la operación de formato.
¿Un almacén dinámico copia profundamente todos los argumentos?
No. La implementación distingue cadenas y valores copiados de vistas y envoltorios de referencia que toman datos prestados.
Fuentes
- doc/api.mdFuente verificada 2026-09-08
- include/fmt/core.hFuente verificada 2026-09-08
- include/fmt/format.hFuente verificada 2026-09-08
- include/fmt/format-inl.hFuente verificada 2026-09-08
- include/fmt/args.hFuente verificada 2026-09-08
- test/args-test.ccFuente verificada 2026-09-08