Sto lavorando all'elaborazione delle immagini e ho bisogno di usare immagini grandi in un sistema critico.
Una buona pratica per i sistemi critici è quella di evitare l'allocazione dinamica della memoria, ma qual è il progetto / i consigli per l'allocazione della memoria statica?
Se eseguiamo un'allocazione statica di una grande matrice, otteniamo un overflow dello stack.
class test
{
public:
test(){};
~test(){};
private:
float m_bigMatrix[3000000];
};
Per risolvere questo problema possiamo definire la matrice come statica, ma questa matrice sarà la stessa per tutte le istanze di questa classe.
static float m_bigMatrix[3000000];
L'altra soluzione è avere un oggetto statico.
static test t;
Ho una soluzione da un altro forum in cui è stato suggerito che il l'approccio migliore sarebbe utilizzare una classe specifica per la gestione della memoria.
Tutte le istanze della classe sono statiche e vengono utilizzate da altre classi nel codice.
Ecco una versione sciatta per questa soluzione (è solo un esempio):
class MemManager
{
public:
MemManager(){ m_counter = 0u; }
~MemManager(){ printf("Out of MemManager nbr %d\n", m_counter); }
uint16_t getCounter() { return m_counter; }
uint16_t getData(uint32_t pos) { return m_data[pos]; }
void setCounter(uint16_t val) { m_counter = val; }
void setData(uint16_t val, uint32_t pos) { m_data[pos] = val; }
private:
static const uint32_t MEM_SIZE_DATA = 100000000u;
uint16_t m_counter;
uint16_t m_data[MEM_SIZE_DATA];
protected:
};
class MemUser
{
public:
MemUser(){ m_memManager = NULL; }
~MemUser(){ printf("Out of MemUser\n"); }
void init(MemManager& memManager) { m_memManager = &memManager; };
uint16_t getCounter() { return m_memManager->getCounter(); }
uint16_t getData(uint32_t pos) { return m_memManager->getData(pos); }
void setCounter(uint16_t val) { m_memManager->setCounter(val); }
void setData(uint16_t val, uint32_t pos) { m_memManager->setData(val, pos); }
private:
MemManager *m_memManager;
protected:
};
int main()
{
static MemManager mManager;
mManager.setCounter(1);
{
MemUser mUser;
mUser.init(mManager);
printf("Exit scope\n");
}
for(uint8_t i = 1u; i<5u; i++)
{
static MemManager mManager2;
printf("Note that mManager2 is the same: %d\n", mManager2.getCounter());
mManager2.setCounter(i);
}
printf("Exit process\n");
return 0;
}
Quindi, è corretto? Qual è la soluzione migliore?