Tengo una función que obtiene un búfer de entrada de n
bytes, y necesita un búfer auxiliar de n
bytes para procesar el búfer de entrada proporcionado.Memoria de preasignación con C++ en entorno de tiempo real
(sé vector es la asignación de memoria en tiempo de ejecución, digamos que estoy usando un vector que utiliza memoria preasignada estática. Imagínese esto es NO un vector de STL.)
El enfoque habitual es
void processData(vector<T> &vec) {
vector<T> &aux = new vector<T>(vec.size()); //dynamically allocate memory
// process data
}
//usage:
processData(v)
Dado que estoy trabajando en un entorno de tiempo real, deseo preasignar toda la memoria que necesitaré de antemano.
El búfer se asigna solo una vez al inicio. Quiero que cada vez que asigne un vector, automáticamente asigne el buffer auxiliar para mi función processData
.
puedo hacer algo similar con una función de plantilla
static void _processData(vector<T> &vec,vector<T> &aux) {
// process data
}
template<size_t sz>
void processData(vector<T> &vec) {
static aux_buffer[sz];
vector aux(vec.size(),aux_buffer); // use aux_buffer for the vector
_processData(vec,aux);
}
// usage:
processData<V_MAX_SIZE>(v);
Sin embargo trabajando mucho con las plantillas no es muy divertido (ahora vamos a recompilar todo lo que ya he cambiado un comentario!), Y me obliga a hacer un poco de contabilidad cada vez que uso esta función.
¿Hay diseños más agradables alrededor de este problema?
pregunta obligatoria: ¿ha perfilado su código para demostrar que la dinámica asignaciones de memoria realmente son un problema? Sé que todo el mundo dice que debe asignar todo por adelantado para cosas en tiempo real, pero realmente depende de su sistema. –
Según los requisitos, lo que hice en el pasado es asignar dinámicamente un tamaño predeterminado. Luego compare el tamaño requerido con el tamaño ya asignado y simplemente reasigne si no hay suficiente espacio. esto asegurará que siempre tenga suficiente espacio y que las asignaciones eventualmente se detengan, estabilizando el sistema. –
@Kristo: "en tiempo real" significa que es un error si el procesamiento lleva más tiempo que un tiempo especificado. La creación de perfiles solo puede mostrar el peor caso que ocurrió durante la ejecución de un perfil, no el peor caso teórico. La asignación dinámica solo es segura si el asignador puede garantizar un límite superior en el tiempo que tomará. –