'std::unique_ptr' 에 대한 지원을 어레이별, 예를 들면 다음과 같습니다.
std::unique_ptr<int[]> p(new int[10]);
과연 필요한? 아마 더 편리하게 사용할 수 있다 '' 또는 '표준용량 어레이입니다 표준용량 벡터입니다'.
사용할 수 있는 모든 chunghwa 찾을 수 있습니까?
어떤 사람들은 사용할 수 있는 여유가 없는 표준용량 벡터입니다 할당 자 ',' 함께 했다. 어떤 사람들은 '필요하다' 는 크기가 동적으로 배열에서 표준용량 어레이입니다 초과됩니다. 어떤 사람들은 그들의 어레이에는 얻을 수 있는 것으로 알고 있는 다른 커넥터로부터 코드 및 복귀하십시오 스토리지였습니다. 그리고 그 코드를 다시 반환되기를 '또는' 벡터 a, t # 39 isn& 될 일이 아니다.
T [] ',' 전날에약혼자에게 > unique_ptr< 있으므로, 서비스 모두 충족시킬 수 있습니다.
한마디로 ',' 할 때 사용하는 unique_ptr< > T [] , 를. # 39 를 사용할 때, 단순히 aren& 대안이 될 수 없다. # 39 마지막 찾았덕라 도구에서는 it& 한다.
There are 저하 및 있는 해결책 그리웠댔지 일치시킵니다 선택할 수 있습니다. 끕니까 상단형 머리는요:
초기 크기
크기조정
[] ',' 와 '-' 어레이입니다 unique_ptr< > 크기조정 허용하지 않는다.
스토리지
복사
'와' 벡터 '-' 어레이입니다 허용하시겠습니까 복사 [], 복사, T '-' unique_ptr< > 허용하지 않습니다.
Swap/move
Pointer/reference/iterator 무효
'-' 어레이입니다 poid 의 객체 포인터, 참조이고 iterator 는 결코 라이브인지 스왑이란 () '에' 무효화할 수 있다.
호환성을 개념 및 알고리즘
솔직히 말해서, 내가 가지고 있는 것처럼 보이는 이 기회를 통해 일부 리팩토링 단위전략 기반 디자인.
한 가지 이유는 unique_ptr don& 경우 # 39 는 사용할 수 있습니다 ',' t want to pay 런타임용으로 개발하십시오 비용을 값을 초기화중 이 어레이입니다.
std::vector<char> vec(1000000); // allocates AND value-initializes 1000000 chars
std::unique_ptr<char[]> p(new char[1000000]); // allocates storage for 1000000 chars
이 '와' () '가 아니라' T '-' 구성자를 표준용량 벡터입니다 표준용량 벡터입니다 크기조정할 초기화하지 가치 '새' 는 하지 않은 경우 't' 는 포드.
Https://stackoverflow.com/questions/15097783/value-initialized-objects-in-c11-and-stdvector-constructor 참조
참고로, 여기서 '대체' 벡터 lionbridge 아니다. https://stackoverflow.com/questions/8228072/is-accessing-the-raw-pointer-after-stdvectorreserve-safe
스콧 마이어스) 는 이 할 말을 유효인 현대의 c++
>. '지적 존재에 대한 관심 때문에 어레이에는 std::unique_ptr' 만 ',' 표준용량 어레이입니다 너회들 이어야 합니다 언제나 더 이상 '이', '사실상' 표준용량 벡터입니다 표준용량 구체화하십시오 선택값 데이터 구조를 기초형상 배열입니다. I can 'T [] 의 상황에 대한 유일한 std::unique_ptr< 때, 알 수 있을 것,' # 39 를 사용하는 경우, re > 감지에서 약간만이라도 you& c-같은 apiu 기초형상 대한 포인터를 반환하는 힙 어레이입니다 solaris. 소유권을 있습니다.
표준용량 어레이입니다 ',' 오히려 '' 와 '' 가 자신의 표준용량 벡터입니다 std::unique_ptr null 포인터입니다. 이 기능은 C api 를 사용하여 작업할 때 편리하게 사용할 수 있는 하나에 작성되지는 어레이나 nulll:
void legacy_func(const int *array_or_null);
void some_func() {
std::unique_ptr<int[]> ptr;
if (some_condition) {
ptr.reset(new int[10]);
}
legacy_func(ptr.get());
}
사용한 ',' 미리 할당된 메모리 풀 구축을 위해 사용되는 > unique_ptr< 챨 [], 게임 엔진이. 이 아이디어는 미리 할당된 메모리 풀 대신 사용할 수 있도록 할 것 같은 동적 할당 요청을 들었다 입자 물리 메모리 충돌 결과 및 기타 / 무료 할당하고자 않고도 각 프레임에서. # 39 의 이 같은 시나리오가 아주 편리한 it& 할당하고자 객체에는 제한된 메모리 풀 필요한 시간 (보통 1, 2 또는 3 프레임) 을 필요로 하지 않는 삶 파괴 논리 (전용 메모리 할당).
간단히 말해서, # 39 의 it& 지금까지 가장 효율적인 메모리.
'A' 와 함께 표준용량 구체화하십시오 포인터입니다, 길이, 그리고 " short-string-optimization"; 것을 의미한다. 하지만 내 상황이 데릭쉐퍼드와 저장하였습니다 문자열으로 보유하고 있는 구조로, 즉 거의 항상 빈 수십만 명의. C 에서, 난 그냥 '', 그리고 대부분의 시간을 널일 챨 사용할 수 있을 것이라고 밝혔다. 단, a ', 고쳐주렴 c++용 작동하는 챨 ' t know 주님으로부터그에게 소멸자 및 doesn& # 39, 삭제할 수 있다. 반면, a ',' 가 > std::unique_ptr< 챨 [], 이 때 자신을 삭제하시겠습니까 아웃해야 댁이라면 내시경이요 하지만 빈 ',' 빈 '표준용량 구체화하십시오 차지합니다 32tb 바이트입니다 std::unique_ptr< 챨, []' 즉, 그 크기를 정확히 8 바이트입니다 > 차지합니다 포인터입니다.
즉, 가장 큰 문제 때마다 그런이야길 끈의 길이에, I have to call '스트린' 때문이다.
일반적인 패턴을 windows가 찾아볼 수 있다. [일부] [GetPackageApplicationIds_MSDN], [] 페이징됩니다 Win32 API 를 사용할 수 있는 ',' > std::unique_ptr<, T, t, 예를 들어 올 수 있는 게 얼마나 큰 도움이 # 39 don& 때 일부 Win32 API 를 호출할 때 출력 버퍼에 당근이지를 합니다 (쓸 수 있는 일부 데이터 버퍼 안에 있는):
// Buffer dynamically allocated by the caller, and filled by some Win32 API function.
// (Allocation will be made inside the 'while' loop below.)
std::unique_ptr<BYTE[]> buffer;
// Buffer length, in bytes.
// Initialize with some initial length that you expect to succeed at the first API call.
UINT32 bufferLength = /* ... */;
LONG returnCode = ERROR_INSUFFICIENT_BUFFER;
while (returnCode == ERROR_INSUFFICIENT_BUFFER)
{
// Allocate buffer of specified length
buffer.reset( BYTE[bufferLength] );
//
// Or, in C++14, could use make_unique() instead, e.g.
//
// buffer = std::make_unique<BYTE[]>(bufferLength);
//
//
// Call some Win32 API.
//
// If the size of the buffer (stored in 'bufferLength') is not big enough,
// the API will return ERROR_INSUFFICIENT_BUFFER, and the required size
// in the [in, out] parameter 'bufferLength'.
// In that case, there will be another try in the next loop iteration
// (with the allocation of a bigger buffer).
//
// Else, we'll exit the while loop body, and there will be either a failure
// different from ERROR_INSUFFICIENT_BUFFER, or the call will be successful
// and the required information will be available in the buffer.
//
returnCode = ::SomeApiCall(inParam1, inParam2, inParam3,
&bufferLength, // size of output buffer
buffer.get(), // output buffer pointer
&outParam1, &outParam2);
}
if (Failed(returnCode))
{
// Handle failure, or throw exception, etc.
...
}
// All right!
// Do some processing with the returned information...
...
[GetPackageApplicationIds_MSDN]: 이아스파스 http://msdn.microsoft.com/en-us/library/windows/desktop/dn270603 (v = vs. 85)
난 내가 겪은 적이 있는 경우 사용할 수 있는 것이다. ',' std::unique_ptr< 부울 [] > HDF5 라이브러리 (라리브러리 위한 효율적인 이진 데이터 스토리지 많이유 과학에서 사용되는). 몇몇 컴파일러들은 (Visual Studio 2015년 내 경우) 제공하십시오 std::vector< bool> 압축, ',' (모든 면에서 부울 사용하여 8 바이트) 가 있으며, 그 같은 일을 위한 재앙이 HDF5 doesn& # 39, t care about 압축입니다. 그 때문에, 을 (를) ',' 는 결국 판독값 쓰레기요 std::vector< bool> hdf5 압축입니다.
게스 후 어딨었는데 구출하기 위한 '에서' didn& 표준용량 벡터입니다 있는 경우, t # 39 일, 내가 필요한 동적 변수를 확실하게 어레이입니다 할당지? -)
이유가 하나 더 추가 허용 및 사용, T, t, [] ',' std::unique_ptr< > hasn& 지금까지 언급된 응답을 # 39 있는 것으로 나타났다. 이 어레이에는 요소점 유형: 너희가운데 전달하십시오. 수 있습니다.
예를 들어 -
>. 마이클레스트라:
class ALargeAndComplicatedClassWithLotsOfDependencies;
class MyClass {
...
private:
std::unique_ptr<ALargeAndComplicatedClassWithLotsOfDependencies[]> m_InternalArray;
};
>. 니클라스스코프:
#include "myclass.h"
#include "ALargeAndComplicatedClassWithLotsOfDependencies.h"
// MyClass implementation goes here
위의 코드는 구조를 통해 누구나 할 수 있는 ',', '와' # include " myclass.h" MyClass 사용할 필요 없이 필요한 내부 구축상의 종속물과의 MyClass::m_InternalArray 포함시키십시오 ''.
만약 '대신', '또는' 이 (가) 로 선언된 m_internalarray std::array< alargeandcomplicatedclasswithlotsofdependencies>, 그 결과, ',' std::vector< .> 각각 - 약간만이라도 사용을 시도한 불완전한 유형, 즉 컴파일 타임 오류:.
사람들이 생각하고, %s/dbase/ext_table. to" " 답할 수 있습니다. '벡터' 대신 '사용' 사건을 CUDA GPU 를 메모리를 할당할 때 나는 unique_ptr 프로그래밍 장치 (go for a 포인터입니다 어레이입니다 합니다 (쿠다마요크 '와'). 그런 다음, 이 데이터를 검색할 때 다시 '와' 에 대한 포인터 호스트입니다 검색하기를 합니다 unique_ptr 포인터입니다 쉽게 처리할 수 있도록 정상입니다.
일반적인 규칙을 통해 함께 있을 수 있는 기본 c++컴파일러는 컨테이너입니다 롤링 자신의 포인터를 가진다. 이는 일반 규칙; 이 회사는 존재한다. # 39 의 there& 보다. 이들은 단순히 참조용이므로.
이 정도면 갈 수 있을 때 가능한 한 포인터입니다 라이트레스트 오토메이티드 디렉토리에만 통해 기존 apiu (창 메시지 또는 스레팅 관련 생각하노라 콜백하는 매개변수입니다) 의 일부 측정 받은후 가진 수명입니다 " caught"; on the other side of the 해칭할 연관해제된 수 있지만, 이는 호출하십시오 코드:
unique_ptr<byte[]> data = get_some_data();
threadpool->post_work([](void* param) { do_a_thing(unique_ptr<byte[]>((byte*)param)); },
data.release());
우리는 우리를 위해 모두가 바라는 것을 잘 할 수 있다. 캐비닛용입니다 c++컴파일러는 다른 시간.
[] ',' unique_ptr< 챨 >, C, C++ 의 성능을 어디서나 편리하게 사용할 수 있습니다. 필요한 고려해보십시오 작업할 수 백만 경우 아직 확인, 수십억 don& # 39, t trust) 의 써줬지 이들 각각의 문자열을 저장하는 별도의 ',' 또는 ',' 객체에는 vector< char> 재해 약간만이라도 대한 메모리 (힙) 관리 루틴. 특히 할당하십시오 및 삭제입니다 문장열 경우 다른 여러 차례.
그러나 그 많은 써줬지 저장하기 위한 단일 버퍼를 할당할 수 있습니다 # 39, 마음에 너회가 wouldn& 버퍼 malloc (char ) = '챨 (total_size),' 에 대해 명백하네 이유 (smart ptrs" 사용하는 이유는 " 검색하겠습니다 명백하네 않을 경우,,). 차라리 '너 같은 unique_ptr< 챨 [] >; 버퍼 (새로운 챨 [total_size]), '
유추, ',' 챨 비사양 적용하십시오 performance& 의해 같은 편의 고려사항입니다 데이터 (수백만 개의 벡터를 고려해보십시오 / 객체 / 호환표).