2013-05-27 25 views
6

Se ho un NSData * da un'API e devo trasformarlo in un file std :: vector per un'altra API, esiste un modo per farlo in modo sicuro senza copiare i byte nel NSData (si assume un NSData * molto grande)?NSData * to std :: vector <unsigned char> Senza copia

+0

Potrebbe essere possibile creare un allocatore personalizzato (il secondo parametro template di 'std :: vector') che esegue questa operazione, ma non penso che ci sia qualcosa di pronto all'uso che lo farebbe per te . –

risposta

4

Nessuna soluzione rapida che viene in mente, no.

Se si crea l'oggetto NSData (invece di essere restituito da un altro API), si potrebbe considerare di sottoclasse NSData e/o NSMutableData quando si ha realmente bisogno per evitare la copia - allora si potrebbe accedere allo storage (std :: vettore) direttamente.

Si può anche essere in grado di sgattaiolare intorno ad esso in alcuni casi, con la creazione di dati con 'tuo' allocazione:

NSData * data([[NSData alloc] 
       initWithBytesNoCopy:vector.data() 
           length:vector.size() 
         freeWhenDone:false]); 

, naturalmente, è necessario assicurarsi che il vettore non viene ridimensionato (o il suo supporto store riallocato) prima che l'oggetto NSData sia deallocato.

A volte è anche necessario prendere in considerazione la modifica del tipo di parametro in modo che non sia un std::vector. Un piccolo contenitore che ha un membro NSData e un'interfaccia vettoriale, un iteratore o un inizio + fine può essere adeguato mentre si adattano altri tipi di collezioni.

1

Non so abbastanza di STL o cpp, ma se si può costruire un vettore da un void * buffer di allora si dovrebbe essere in grado di con:

void * buffer = [data bytes]; 
size_t len = [data length]; 

tenere a mente che i dati possiede il buffer in modo da non liberarlo.

Problemi correlati