나는 현재 배열이나 원시 데이터의 벡터를 (_readStream
이 std::ifstream
입니다) 읽을 수있는 다음과 같은 기능을 가지고 :반복자가 연속 메모리 영역을 형성하는지 여부를 확인하는 방법은 무엇입니까?
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();
}
첫 번째 질문 :이 기능을 사용하면 괜찮을 것입니까?
우리는 직접 메모리 블록을 읽었으므로 first
에서 last
까지의 메모리 블록이 메모리에서 인접 해있는 경우에만 작동합니다. 그것을 확인하는 방법? std::iterator_traits
가 unconditonally 정의 부재 형 iterator_category
와 기본 템플릿을 갖기 때문에
함수는 함수 사용 방법에 대해 많은 가정을합니다. 그들이 명백하거나 적어도 문서화되어 있다면 더 좋을 것입니다. 이러한 가정들 중에서 : 1) 그 요소들은 메모리에서 이진 표현에 의해 직렬화 될 수 있습니다. 2) 런타임의 endianess는 데이터를 작성한 endianess와 동일합니다. – Cameron
사실, 함수가 완전히 비 제너릭 일 때 반복자를 사용하는 이유는 무엇입니까? 그 유일한 목적은 원소들을 비트 단위로 메모리에 복사하는 것입니다. 이것을 반영하기 위해 함수의 이름을 변경하고 iterators 대신 포인터와 카운트를 가져 오십시오 ... 제목에있는 질문은 여전히 흥미 롭습니다 :-) – Cameron
엔디안이 다른 경우 데이터를 바꿀 수있는 또 다른 함수가 있습니다. 두 번째 문제는 문제가되지 않습니다. – Vincent