Ho una funzione che ottiene un buffer di input di n
byte e richiede un buffer ausiliario di n
byte per elaborare il buffer di input specificato.Preallocazione della memoria con C++ in ambiente realtime
(lo so vettore è l'allocazione della memoria in fase di esecuzione, diciamo che sto usando un vettore che utilizza una memoria preallocato statica. Immaginate questo NON è un vettore STL.)
L'approccio comune è
void processData(vector<T> &vec) {
vector<T> &aux = new vector<T>(vec.size()); //dynamically allocate memory
// process data
}
//usage:
processData(v)
Dal momento che sto lavorando in un ambiente in tempo reale, desidero preallocare tutta la memoria che avrò mai bisogno in anticipo.
Il buffer viene assegnato una sola volta all'avvio. Voglio che quando alloco un vettore, allocherò automaticamente il buffer ausiliario per la mia funzione processData
.
che posso fare qualcosa di simile con una funzione template
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);
Tuttavia lavorando molto con i modelli non è molto divertente (ora diamo ricompilare tutto da quando ho cambiato un commento!), E mi costringe a fare un po 'di contabilità ogni volta che uso questa funzione.
Esistono progetti più interessanti in merito a questo problema?
Campo obbligatorio: hai profilato il codice per dimostrare che la dinamica le allocazioni di memoria sono davvero un problema? So che tutti dicono che dovresti allocare tutto in anticipo per cose in tempo reale, ma in realtà dipende dal tuo sistema. –
A seconda dei requisiti, ciò che ho fatto in passato è allocare dinamicamente una dimensione predeterminata. Quindi confrontare le dimensioni richieste con le dimensioni già allocate e riallocare se non c'è abbastanza spazio. questo assicurerà di avere sempre abbastanza spazio e che le allocazioni finiranno per stabilizzare il sistema. –
@ Kristo: "tempo reale" indica che si tratta di un errore se l'elaborazione richiede più tempo di un intervallo di tempo specificato. Il profilo può mostrare solo il caso peggiore che si è verificato durante l'esecuzione di un profilo, non il caso peggiore teorico. L'allocazione dinamica è sicura solo se l'allocatore può garantire un limite superiore al tempo necessario. –