C'è modello in STL, esaltazione o altro LGPL toolkit open-source che si comporta esattamente come questo: -
- un puntatore relativo con l'allineamento personalizzati, possibilità di memorizzare un numero inferiore di bit per ridurre la portata. una possibile implementazione di illustrare: -puntatore offset compatto, implementazioni esistenti?
template<typename T, typename OFFSET=int,
int ALIGN_SHIFT=2>
class OffsetPtr
{
OFFSET ofs;
public:
T* operator->() {
return (T*) (((((size_t)this)>>ALIGN_SHIFT)+ofs)<<ALIGN_SHIFT);
};
void operator=(T* src) {
size_t ofs_shifted = (((size_t) src)>>ALIGN_SHIFT) - (((size_t) this)>>ALIGN_SHIFT); //asserts..
ofs = (OFFSET) (ofs_shifted);
}
//...
};
Il suo qualcosa che abbia regolarmente creare in passato (precompilati data-strutture di cache-friendly compatte), ad esempio, per i dati suddivisi in blocchi di 128 k sotto OFFSET = breve
Un'altra variante che utilizzerei nei vecchi C#definiti userebbe gli offset da un'intestazione, dove gli allineamenti sarebbero più utili.
Ho visto qualcosa su una 'libreria di interprocessi' in boost con un 'offset_ptr', che sembra molto simile, quindi sembra probabile che ci sia un'implementazione esistente compreso questo modello esatto da qualche parte. E 'veloce da scrivere, ma ci potrebbe essere benefici per un'implementazione esistente come una suite di strutture di dati conformi stl associato costruiti intorno lo stesso concetto - un 'nei pressi di vettore' con 16bit compensata puntatore & conteggio a 16 bit ad esempio
Boost's 'offset_ptr <>' è diverso da quello che si desidera - memorizza la distanza tra l'indirizzo del puntatore di offset stesso e l'indirizzo dell'oggetto puntato, piuttosto che consentire un offset arbitrario. Personalmente, penso che sia mal chiamato; 'relative_ptr <>' sarebbe più appropriato. – ildjarn
Certo, come in "indirizzamento relativo". Di solito l'ho chiamato offset, quindi anche a me va bene, anche se forse potrei chiamare il mio 'parente' per distinguerlo dai boost ', buon suggerimento. –