2011-11-27 2 views
5

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

+0

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

+0

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. –

risposta

2

Se si' usando Visual C++, potresti voler usare __based pointers.

+0

grazie. Non sapevo che esistesse. Purtroppo devo evitare le estensioni MS specifiche, mentre mi compilo principalmente con gcc e llvm, mi chiedo se C++ 11 abbia qualcosa di simile. Venendo dal codice di basso livello ai tempi di asm, il mio metodo usuale era un offset dalla base della struttura stessa che di solito era più conveniente. Ha funzionato bene anche come macro C, ma l'implementazione sopra era molto allettante in C++. –