ich zur Zeit die folgende Funktion hat einen Array oder einen Vektor von Rohdaten zu lesen (_readStream
ist eine std::ifstream
):Wie überprüft man, ob Iteratoren eine zusammenhängende Speicherzone bilden?
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();
}
Erste Frage: Ist diese Funktion scheint für Sie in Ordnung?
Da wir direkt einen Speicherblock lesen, wird es nur funktionieren, wenn der Speicherblock von first
bis last
zusammenhängend im Speicher ist. Wie überprüft man das? Diese
Ihre Funktion macht viele Annahmen darüber, wie sie verwendet werden. Es wäre besser, wenn sie explizit oder zumindest dokumentiert wären. Unter diesen Annahmen: 1) Dass Elemente durch ihre binäre Darstellung im Speicher serialisiert werden können. 2) Dass die Endgültigkeit der Laufzeit dieselbe ist wie diejenige der Daten, die die Daten geschrieben haben. – Cameron
Warum überhaupt Iteratoren verwenden, wenn die Funktion vollständig nicht-generisch ist? Der einzige Zweck besteht darin, Elemente in den Speicher zu kopieren. Benennen Sie die Funktion um, um dies widerzuspiegeln, und nehmen Sie einen Zeiger und eine Zählung anstelle von Iteratoren ... Die Frage in Ihrem Titel ist immer noch interessant :-) – Cameron
Ich habe eine andere Funktion, um die Daten zu tauschen, wenn die Endianess anders war als Ihre zweiter Punkt ist kein Problem. – Vincent