Nie ma niezdefiniowanego zachowania tutaj, jeśli można łatwo kopiować T
, co z pewnością stanowi POD. vector<T>::data
gwarantuje zwrócenie wskaźnika do sąsiedniej tablicy vector<T>::size
T
s, a reprezentacja obiektu typu możliwego do kopiowania T
gwarantuje ciągłą sekwencję bajtów sizeof(T)
(ewentualnie z wewnętrznym dopełnieniem).
Jeśli bajty, które przechowujesz w tym miejscu, są nieprawidłowe T
reprezentacji obiektów, możesz uzyskać niezdefiniowane zachowanie podczas uzyskiwania do nich dostępu. Dokładnie to, które sekwencje bajtów stanowią poprawną reprezentację obiektu, to trochę szarego obszaru; przynajmniej powinieneś być w stanie w przenośny sposób zapisać bazowe bajty obiektu o typie kopiowalnym trywialnie do pliku i skutecznie odczytać je z powrotem do bazowych bajtów obiektu tego samego typu.
Na litość paranoja jest, prawdopodobnie umieścić:
static_assert(std::is_trivially_copyable<T>(),
"NO NO NO - T MUST BE TRIVIALLY COPYABLE!");
przed file.read
dla przyszłych-proofing.
'size_of' ==' sizeof'? Tak czy inaczej, pamiętaj, że rozmiar obiektu w pamięci niekoniecznie odpowiada rozmiarowi obiektu zapisanego w pliku (wypełnienie itp.) - to naprawdę zależy od tego, jak obiekt został napisany na początku. –
@KonradRudolph: Dzięki, naprawione. Jeśli napisany w ten sposób (zły dla przenośności, w porządku dla mojego przypadku użycia) poprzez jednoznaczne zapisanie pamięci, powinien zostać odczytany w ten sposób. Jestem bardziej ciekawy części 'v.data'. –
Powinieneś określić, czym jest 'T', aby uzyskać poprawne odpowiedzi. Czy to jest typ POD? –