ho attualmente la seguente funzione per leggere un array o un vettore di dati grezzi (_readStream
è una std::ifstream
):Come verificare se gli iteratori formano una zona di memoria contigua?
template<typename IteratorType>
inline bool MyClass::readRawData(
const IteratorType& first,
const IteratorType& last,
typename std::iterator_traits<IteratorType>::iterator_category* = nullptr
)
{
_readStream.read(reinterpret_cast<char*>(&*first), (last-first)*sizeof(*first));
return _readStream.good();
}
Prima domanda: non questa funzione sembra ok per voi?
Come si legge direttamente un blocco di memoria, funzionerà solo se il blocco di memoria da first
a last
è contiguo nella memoria. Come controllarlo?
La funzione fornisce molte ipotesi su come verrà utilizzata. Sarebbe meglio se fossero espliciti, o almeno documentati. Tra questi presupposti: 1) che gli elementi possono essere serializzati dalla loro rappresentazione binaria in memoria. 2) Che l'endianess del runtime è uguale a quello di quello che ha scritto i dati. – Cameron
In realtà, perché utilizzare gli iteratori quando la funzione è completamente non generica? Il suo unico scopo è quello di copiare gli elementi in bit a bit in memoria. Rinomina la funzione per riflettere questo e prendi un puntatore e un conteggio invece di iteratori ... La domanda nel tuo titolo è comunque interessante :-) – Cameron
Ho un'altra funzione per scambiare i dati se l'endianness era diverso, quindi il tuo il secondo punto non è un problema. – Vincent