Jeśli mam NSData * z jednego API i muszę zamienić to na std :: vector dla innego API, czy istnieje sposób na bezpieczne wykonanie tego procesu bez kopiowania bajtów w NSData (zakładamy bardzo dużą NSData *)?NSData * na std :: wektor <unsigned char> Bez kopii
Odpowiedz
Brak szybkiego rozwiązania, które przychodzi na myśl, nie.
Jeśli utworzysz obiekt NSData (a nie zostanie on zwrócony przez inny interfejs API), możesz rozważyć podklasy NSData
i/lub NSMutableData
, kiedy naprawdę potrzebujesz ominąć kopię - wtedy możesz uzyskać dostęp do magazynu (std :: wektor) bezpośrednio.
może także być w stanie podkraść się wokół niego w niektórych przypadkach poprzez stworzenie dane z „swojej” Przeznaczenie:
NSData * data([[NSData alloc]
initWithBytesNoCopy:vector.data()
length:vector.size()
freeWhenDone:false]);
oczywiście, trzeba upewnić się, że wektor nie jest zmieniany (lub jej podkład ponowne przydzielenie pamięci) przed zwolnieniem obiektu NSData
.
Czasami należy również rozważyć zmianę typu parametru, aby nie był to std::vector
. Mały pojemnik z elementem NSData
i interfejsem podobnym do wektora, iteratorem lub początkiem + końcem może być wystarczający przy dostosowywaniu innych typów kolekcji.
nie wiem wystarczająco dużo o STL lub CPP, ale czy można skonstruować wektor z pustce * bufor to powinieneś być w stanie z:
void * buffer = [data bytes];
size_t len = [data length];
pamiętać, że dane jest właścicielem bufor, więc nie możesz go uwolnić.
Możliwe, że możesz utworzyć niestandardowy przydział (drugi parametr szablonu z 'std :: vector'), który to robi, ale nie sądzę, że jest coś nieoczekiwanego, co zrobiłoby to za ciebie . –