2013-05-27 2 views
6

하나의 API에서 NSData *를 가지고 있고이를 다른 API의 std :: vector로 변환해야한다면, 복사하지 않고 안전하게이 작업을 수행 할 수있는 방법이 있습니까? NSData의 바이트 (매우 큰 NSData * 가정)?NSData * to std :: vector <부호없는 char> 복사하지 않고

+0

이 작업을 수행하는 사용자 정의 할당 자 ('std :: vector'의 두 번째 템플릿 매개 변수)를 생성 할 수도 있지만,이 작업을 수행 할 수있는 out-of-the-box는 없다고 생각합니다 . –

답변

4

마음에 떠오르는 빠른 해결책이 없습니다.

(다른 API에서 반환하는 것이 아니라) NSData 객체를 만드는 경우 실제로 복사를 피할 필요가있을 때 NSData 및/또는 NSMutableData의 하위 클래스를 고려할 수 있습니다. 그러면 저장소에 액세스 할 수 있습니다 (std :: 벡터).

또한 '당신'할당과 데이터를 생성하여 어떤 경우에는 주위에 몰래 할 수 있습니다 : 물론

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

을, 당신은 벡터 크기를 조정 (또는 백업되지 않았는지 확인해야합니다 저장소가 다시 할당 됨). NSData 개체가 할당 해제됩니다.

경우에 따라 std::vector이 아닌 매개 변수 유형을 변경하는 것도 고려해야합니다. 다른 컬렉션 유형을 수용하면서 NSData 멤버 및 벡터와 같은 인터페이스, 반복자 또는 begin + end를 갖는 작은 컨테이너가 적합 할 수 있습니다.

1

내가 STL 또는 CPP에 대해 충분히 모르겠지만, 당신은 빈 공간에서 벡터를 구성 할 수있는 경우 * 버퍼가 당신과 함께 할 수 있어야한다 : 데이터가를 소유

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

염두에 두어야 버퍼 그래서 당신은 그것을 무료로하지 않을 수 있습니다.

관련 문제