C++ 11에서 작업하는 경우 scoped_array<T>
이 아닌 unique_ptr<T[]>
으로 작업해야합니다. 그것은 scoped_array
이 할 수있는 모든 것을 할 수 있습니다.
직사각형 배열이 필요한 경우 기본 데이터를 보유하려면 unique_ptr<double[]>
을 사용하고 행 기준을 보유하려면 unique_ptr<double*[]>
을 사용하는 것이 좋습니다. 이 같은 뭔가를 작동합니다 :
unique_ptr<double[]> data{ new double[5*3] };
unique_ptr<double*[]> rows{ new double*[3] };
rows[0] = data.get();
for (size_t i = 1; i!=5; ++i)
rows[i] = rows[i-1]+3;
는 그런 다음
double**
을 복용 함수에
rows.get()
를 전달할 수 있습니다. 이 접근법은 비 직사각형 배열에서도 작동 할 수 있습니다. 배열 작성시 배열의 형상이 알려지면 모든 데이터를 한 번에 할당하고
rows
을 적절한 오프셋으로 지정할 수 있습니다. (단순한 루프처럼 단순하지는 않습니다.)
이렇게하면 두 개의 할당 만 수행하기 때문에 참조 및 메모리 사용의 지역성이 향상됩니다. 모든 데이터는 메모리에 함께 저장되며 별도의 할당에 대한 추가 오버 헤드는 없습니다.
지그재그 배열을 만든 후에 지오메트리 배열을 변경하려면이 솔루션을 적용 할 수 있도록 저장소를 관리하는 원칙적인 방법을 찾아야합니다. 그러나 scoped_array
을 사용하여 형상을 변경하면 (swap()
의 특정 용도가 필요함) 어색하며, 이것이 문제가되지 않는다면 놀랄 일이 아닙니다.
(이 방법은 scoped_array
뿐만 아니라 unique_ptr<[]>
작업 할 수 있습니다, 우리가 지금 C++ (11)에있을 때부터 단순히 unique_ptr
를 사용하여 설명하고있다.)
"기존 코드"의 API는 무엇입니까? 가변형 배열을'double **'으로 어떻게 넘길 수 있는지 보지 못합니다 - 크기 정보는 어디에 있습니까? – Casey