Domanda

Stiamo usando c ++ per sviluppare un'applicazione che gira su Windows CE 4 su un sistema incorporato.

Uno dei nostri vincoli è che tutta la memoria utilizzata dall'applicazione deve essere allocata durante solo l'avvio . Abbiamo scritto molti contenitori e algoritmi che utilizzano solo memoria preallocata anziché allocarne una nuova.

Pensi che sia possibile per noi utilizzare le librerie boost invece dei nostri contenitori in queste condizioni?

Eventuali commenti e / o consigli sono i benvenuti!

Grazie mille

Nic

È stato utile?

Soluzione

È possibile scrivere il proprio allocatore per il contenitore, che alloca da un buffer statico di dimensioni fisse. A seconda dei modelli di utilizzo del contenitore, l'allocatore potrebbe essere semplice come incrementare un puntatore (ad esempio quando si inserisce roba nel contenitore una sola volta all'avvio dell'app e non si aggiungono / rimuovono continuamente elementi.)

Altri suggerimenti

Utilizziamo boost per i sistemi integrati . Con boost puoi selezionare e scegliere ciò che usi. Usiamo smart_ptr e boost::bind in tutti i nostri progetti. Scriviamo software per telefoni cellulari economici . E se Windows CE può essere eseguito sul tuo hardware, mi aspetto che parti di boost siano applicabili. Ci sono parti di boost che non hanno allocazione e potresti trovarle utili.

Vorrei scegliere e scegliere in base alle tue esigenze.

Come qualsiasi cosa tu usi, devi conoscere i costi.

Sostituire i contenitori con i contenitori Boost NON è una buona idea. Il lavoro per creare allocatori personalizzati appropriati non sarebbe così male, ma violeresti lo spirito della tua regola "alloca all'avvio". L'idea alla base di questa regola (secondo la mia esperienza) è generalmente quella di assicurarsi che non si debbano affrontare situazioni di tipo memoria insufficiente in fase di esecuzione. L'idea è quella di assicurarsi di avere tutta la memoria di cui potresti aver bisogno in DESTRA ALL'INIZIO, in modo che non ci sia alcuna possibilità che nessuna parte del sistema rimanga a corto di memoria in seguito.

Se hai usato i contenitori Boost con un allocatore personalizzato, dovresti improvvisamente occuparti della possibilità che il pool dal quale il container sta allocando potrebbe svuotarsi, eliminando così lo scopo della regola 'allocate at startup'.

Nella situazione di un dispositivo di memoria limitato, eviterei qualsiasi tipo di contenitore più complesso di un array allocato staticamente.

Boost è un insieme di librerie. Alcuni di questi sono focalizzati sulla metaprogrammazione dei modelli. Quelli non usano nemmeno memoria in fase di esecuzione. Ma la tua domanda sembra riguardare la sostituzione dei contenitori. Dubiterei che sia possibile tranne l'uso di allocatori personalizzati. Ma anche in questo caso, è molto probabile che utilizzereste semplici contenitori STL e non aumentiate. Boost fornisce solo i contenitori TR1, per quei compilatori che non includono ancora TR1.

Non utilizzare Boost.

È una grande libreria e i requisiti di allocazione della memoria di base sono molto diversi da quelli dei progettisti delle librerie.

Anche se riesci a far funzionare una versione corrente di Boost in base alle tue esigenze con allocatori personalizzati, potrebbe rompersi con una nuova versione di Boost.

Sentiti libero di consultare il codice sorgente di Boost per alcune idee utili ma usa la tua implementazione per quello che ti serve.

Sto esaminando questo in questo momento & # 8212; Vorrei utilizzare buffer circolari, contenitori senza lock e I / O asincroni e invece di allocare memoria dinamica, preferirei utilizzare pool di memoria.

Il problema più grande che ho visto finora è che shared_ptr viene utilizzato in molti luoghi, senza un modo semplice per sostituirlo con intrusive_ptr . Poiché shared_ptr alloca memoria dinamica per tenere traccia del conteggio dei riferimenti, non posso utilizzarlo in un sistema incorporato.

Risolvere il problema sembra fattibile, ma molto lavoro & # 8212; Devo espandere le specifiche del modello di qualsiasi classe che contiene un shared_ptr in modo che il tipo specifico di puntatore condiviso possa essere modificato in intrusive_ptr se lo si desidera. Quindi ora devo considerare quanto lavoro sarà, rispetto a quanto lavoro sarà per scrivere la mia versione delle funzionalità Boost di cui ho bisogno. Non è un posto piacevole dove stare.

Spero che qualcuno sottolinei perché mi sbaglio su questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top