Qui non c'è un comportamento non definito se T
è banalmente copiabile, quali sono certamente i POD. vector<T>::data
è garantito per restituire un puntatore a un array contiguo di vector<T>::size
T
s e la rappresentazione dell'oggetto di un tipo banalmente copiabile T
è una sequenza contigua di sizeof(T)
byte (che potrebbe includere il riempimento interno).
Se i byte memorizzati in quello spazio non sono validi rappresentazioni oggetto T
, è possibile ottenere un comportamento non definito quando si accede a loro. Esattamente quali sequenze di byte costituiscono una rappresentazione oggetto valida T
è un po 'un'area grigia; per lo meno dovresti essere in grado di scrivere in modo portabile i byte sottostanti di un oggetto di un tipo banalmente copiabile in un file e rileggerli correttamente nei byte sottostanti di un oggetto dello stesso tipo.
Per l'amor di paranoia, probabilmente sarei messo:
static_assert(std::is_trivially_copyable<T>(),
"NO NO NO - T MUST BE TRIVIALLY COPYABLE!");
prima della file.read
per future-proofing.
'size_of' ==' sizeof'? Ad ogni modo, sii consapevole che la dimensione di un oggetto in memoria non corrisponde necessariamente alla dimensione dell'oggetto quando viene scritto su un file (padding ecc.) - in realtà dipende da come l'oggetto è stato scritto per cominciare. –
@KonradRudolph: Grazie, risolto. Se scritto in questo modo (cattivo per la portabilità, bene per il mio caso d'uso) scrivendo esplicitamente la memoria, dovrebbe essere letto in questo modo. Sono più curioso della parte 'v.data'. –
Si dovrebbe specificare cosa 'T' è per ottenere risposte corrette. È un tipo POD? –