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
risposta
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.
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.
- 1. Come convertire std :: vector <unsigned char> nel vettore <char> senza copiare?
- 2. Conversione (void *) in std :: vector <unsigned char>
- 3. Copia veloce di `std :: vector <std :: uint8_t>`
- 4. Inizializzazione di std :: vector <unsigned int> con un elenco di interi consecutivi senza segno
- 5. Overhead to using std :: vector?
- 6. C'è un modo per convertire std :: vector <const T*> in std :: vector <T*> senza allocazioni aggiuntive?
- 7. convert <vector><string> TO <vector><int> C++, Win32
- 8. Come convertire std :: vector <std :: reference_wrapper <T>> a std :: vector <T>
- 9. Restituisce un C++ std :: vector senza una copia?
- 10. Posso trasmettere std :: vector <Animal*> a std :: vector <Dog*> senza esaminare ciascun elemento?
- 11. vector <unsigned char> vs stringa per dati binari
- 12. std :: vector <std::string> crash
- 13. Mat to unsigned char *
- 14. Impossibile convertire 'vector <unsigned long>' per Python oggetto
- 15. Copia elementi da std :: vector in std :: stack C++
- 16. Ordinamento di std :: vector <std :: pair <std :: string, bool >> per la stringa?
- 17. std :: vector <bool> implementazione ottimizzazione
- 18. C++: vector to stringstream
- 19. Copia di una matrice in uno std :: vector
- 20. std :: sort senza copia costruzione
- 21. Conversione da std :: string a std :: vector <char>
- 22. Come salvare `std :: vector <uchar>` in `std :: ostream`?
- 23. trova in std :: vector <std::pair>
- 24. È std :: vector che copia gli oggetti con un push_back?
- 25. Byte Array to NSData
- 26. NSData to UIImage
- 27. Destroy std :: vector senza rilasciare memoria
- 28. Huge std :: vector <std::vector> non rilascia tutta la memoria in caso di distruzione
- 29. NSImage to NSData, then to UIImage
- 30. copia di uno std :: vector a un qvector
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 . –