Obecnie mam następującą funkcję odczytywania tablicy lub wektor surowych danych (_readStream
jest std::ifstream
):Jak sprawdzić, czy iteratory tworzą ciągłą strefę pamięci?
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();
}
Pierwsze pytanie: czy ta funkcja wydaje się ok dla ciebie?
Ponieważ odczytujemy bezpośrednio blok pamięci, działa on tylko wtedy, gdy blok pamięci od first
do last
jest ciągły w pamięci. Jak to sprawdzić?
Twoja funkcja zawiera wiele założeń dotyczących sposobu jej użycia. Byłoby lepiej, gdyby były wyraźne, a przynajmniej udokumentowane. Wśród tych założeń: 1) Elementy mogą być serializowane przez ich binarną reprezentację w pamięci. 2) że endianess środowiska wykonawczego jest taki sam jak ten, który zapisał dane. – Cameron
Właściwie dlaczego warto używać iteratorów, gdy funkcja jest całkowicie nietypowa? Jego jedynym celem jest częściowe kopiowanie elementów bitowych do pamięci. Zmień nazwę funkcji, aby to odzwierciedlić, i poproś o wskaźnik i liczbę zamiast iteratorów ... Pytanie w tytule jest nadal interesujące :-) – Cameron
Mam inną funkcję do zamiany danych, jeśli endianness był inny, więc twój Drugi punkt nie stanowi problemu. – Vincent