Cómo declarar en C++ una función que recibe un bloque de memoria

Fuentes: How to Declare a C++ Function that Takes a Blob of Memory?
Imagen generada por IA con el prompt: Editorial illustration of a C++ code snippet on a dark IDE screen, highlighting a function signature with a void pointer and size parameter, surrounded by tangled alternatives like uint8_t and std::span.
Imagen generada con IA

Declarar en C++ una función que acepta un bloque genérico de memoria parece trivial, pero la elección de la firma no lo es. Este artículo analiza las opciones habituales: el clásico void DoSomething(const void* p, size_t numBytes) heredado de C, la variante con const uint8_t* que obliga a añadir reinterpret_cast al pasar estructuras personalizadas, y la propuesta moderna con std::span<T> (incluyendo sus versiones con plantilla y tamaño fijo). La conclusión del autor es clara: para punteros a bloques de memoria arbitrarios, void* con un parámetro de tamaño sigue siendo la opción más simple y legible, ya que permite invocar la función directamente con DoSomething(&data, sizeof(data)) sin conversiones. El texto reconoce, no obstante, que añadir anotaciones SAL como _In_reads_bytes_(numBytes) permite mantener esa simplicidad y, al mismo tiempo, aportar información valiosa a analizadores estáticos para detectar errores de memoria. Se trata, en definitiva, de una defensa argumentada de mantener hábitos de C en el código C++ moderno cuando estos mejoran la claridad.