Sto lavorando a un pool di memoria per un piccolo motore di gioco.Cosa considerare per quanto riguarda l'allineamento durante la progettazione di un pool di memoria?
L'utilizzo principale sarà come deposito separato; un pool contiene oggetti di un tipo e una dimensione specifici. Attualmente i pool possono essere utilizzati per archiviare qualsiasi cosa, ma le allocazioni verranno eseguite in blocchi di una dimensione specifica. La maggior parte del fabbisogno di memoria verrà allocata contemporaneamente, ma la "crescita eccessiva" può essere abilitata se necessario per facilitare l'ottimizzazione (dimensioni quasi fisse).
Il problema è che ho iniziato a diventare un po 'paranoico quando si esamina l'allineamento della memoria. Sono abituato solo alla gestione della memoria grezza su processori a 8 bit in cui tutto è allineato in byte.
Sto lasciando che l'utente (me) specifichi la dimensione desiderata dei blocchi, che nel caso di archiviazione segregata sarebbe la dimensione degli oggetti che sto per memorizzare in esso.
L'approccio attuale è di allocare un grosso della memoria blocks * (desired_size + header_size)
grande e posizionare gli oggetti in esso, con un'intestazione per ogni blocco; gli oggetti sarebbero ovviamente posizionati direttamente dietro questa intestazione.
Che cosa devo considerare per quanto riguarda l'allineamento della memoria nel mio scenario?
La risposta che ho trovato finora è che finchè desired_size
rappresenta n -byte dati allineati; l'intestazione è correttamente allineata e impacchettata dal compilatore, così come i dati effettivi, tutto ciò che è memorizzato nel blocco sarà n- -byte allineato.
n è qualsiasi limite richiesto dalla piattaforma. Per il momento sto prendendo di mira x86, ma non mi piace fare supposizioni sulla piattaforma nel mio codice.
Alcune delle risorse che ho usato:
- http://www.ibm.com/developerworks/library/pa-dalign/
- http://en.wikipedia.org/wiki/Data_structure_alignment
- Memory alignment on a 32-bit Intel processor
- documentazione Boost Pool per l'ispirazione al disegno generale. Vorrei evitare di trascinare la spinta in questo progetto; e sto vedendo anche questa come un'opportunità di apprendimento.
Modifica
codice Uploaded piccolo campione che può utile a nessuno confuso quanto me in futuro here.
Potrebbe anche aggiungere che lo stesso vale per tutte le funzioni di allocazione (quindi ':: operatore new' e parentela.) – GManNickG
Grazie per la risposta. Come si determina il massimo. allineamento di un tipo? Se ho capito correttamente il tuo secondo paragrafo - assumiamo x86 qui per semplicità - questo significa che se l'intestazione è grande 4 byte, sarà allineata a 4 byte, e i dati sono 8 byte di grandi dimensioni saranno 8 byte allineati. Ciò significherebbe che ho bisogno di pad header con 4 byte per rendere i dati allineati correttamente, corretto? – Skurmedel
Ho pensato alla tua proposta "abbastanza buona", suona pragmatica; Mi piace il pragmatico. Come potrei sapere cosa è abbastanza buono, questo semplicemente assicurerebbe che l'intestazione sia allineata al massimo. allineamento della piattaforma o dipenderebbe dalla dimensione effettiva dei dati memorizzati (rendendola meno desiderabile)? – Skurmedel