Sto sovraccaricando operator new
, ma di recente ho riscontrato un problema con l'allineamento. Fondamentalmente, ho una classe IBase
che fornisce operator new
e delete
in tutte le varianti richieste. Tutte le classi derivano da IBase
e quindi utilizzano anche gli allocatori personalizzati.operatore nuovo sovraccarico e allineamento
Il problema che sto affrontando ora è che ho un figlio Foo
che deve essere allineato a 16 byte, mentre tutti gli altri vanno bene quando sono allineati a 8 byte. Il mio allocatore di memoria tuttavia si allinea ai limiti di 8 byte solo per impostazione predefinita, quindi ora il codice in IBase::operator new
restituisce un pezzo di memoria inutilizzabile. Come si dovrebbe risolvere questo problema correttamente?
Posso semplicemente forzare tutte le allocazioni a 16 byte, che funzioneranno correttamente finché non verrà visualizzato un tipo allineato a 32 byte. Capire l'allineamento all'interno di operator new
non sembra essere banale (posso fare una chiamata di funzione virtuale per ottenere l'allineamento effettivo?) Qual è il modo consigliato di gestirlo?
So che malloc
si suppone che restituisca un pezzo di memoria che è adeguatamente allineato per tutto, purtroppo, questo "tutto" non include i tipi di SSE e mi piacerebbe davvero farlo funzionare senza richiedere all'utente di ricordare quale tipo ha quale allineamento.
Forse potresti utilizzare un IBase diverso (IBase16?) Per i pochi oggetti che hanno requisiti di allineamento speciali. –
Si potrebbe anche creare questa classe base (IBase16, IBase32) con template, quindi è possibile utilizzare IBase. –
Patrick
È possibile eseguire l'allineamento sui limiti a 64 byte. :) – Bill