모든 루프 반복을 벡터로 청소하십시오. 가장 메모리 효율적인 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/618169

문제

STD :: 벡터에 대한 질문이 있습니다.

벡터 크기를 예측하고 벡터를위한 충분한 메모리를 미리 예약하는 것을 예측하는 메모리 집중 알고리즘이 있습니다. 메모리 사용을 줄이는 데 많은 도움이 될 것입니다.

다음 중 어느 것이 더 나은지 :

for ( ... ) {
  std::vector<Type> my_vector;
  my_vector.reserve(stuff_count);
  // Do stuff , and append stuff to my_vector.
}

아니면 이거:

std::vector my_vector;
for ( ... ) {
  my_vector.clear();
  my_vector.reserve(stuff_count);
  // Do stuff , and append stuff to my_vector.
}

어떤 것이 가장 좋은지, 또는 더 나은 일을하는 방법이 있는지 알려주세요.

미리 감사드립니다!

도움이 되었습니까?

해결책

첫 번째 변형을 사용하면 각 반복에 벡터의 버퍼를 재 할당합니다. 일반적으로 비용이 많이 듭니다. 두 번째 변형을 사용하면 가끔만 재 할당됩니다. 두 번째 변형은 속도가 우선 순위이므로 더 좋습니다.

요소 수가 어디에서 알 수 있는지에 대한 질문은 확실하지 않습니다. 어쩌면 모든 반복에 대한 최대 요소 수를 신속하게 계산하고 버퍼 크기로 설정하고 재 할당이 없습니다.

다른 팁

벡터 크기를 예측하고 벡터를위한 충분한 메모리를 미리 예약하는 것을 예측하면 메모리 사용을 줄이는 데 많은 도움이 될 것입니다.

재산이 아닌 엔지니어처럼 행동하십시오. 테스트를 만들고 차이를 측정하십시오.

두 번째는 약간 더 빠를 수 있지만 첫 번째는 더 깨끗합니다.

코드의 차이가 사소한 것이므로 두 가지 접근 방식을 모두 테스트하고 특정 응용 프로그램에 가장 적합한 것이 가장 적합한 것을보십시오.

그것은 유형이 어떻게 구성/파괴되어야하는지에 대해 약간 의존합니다. 파괴가 필요하지 않은 포드 인 경우 루프에서 모든 소멸자를 호출하는 Clear ()를 건너 뛰고 대신 정적 배열로 사용할 수 있습니다.

std::vector<Type> my_vector(size);
for (...)
{
  int index = 0;
  // Do stuff
  my_vector[index] = some_value;
}

(경고 : 코드 테스트되지 않은 코드)

... 벡터에 대한 충분한 메모리를 미리 예약하면 메모리 사용을 줄이는 데 많은 도움이됩니다.

오류 ... 뭐?! 그것은 전혀 말이되지 않습니다. 메모리를 예약하는 것은 어떤 식 으로든 메모리 사용을 줄이는 데 도움이되지 않습니다. 그것은 일정한 재 할당의 필요성을 방지하여 일을 더 빨리 만들지 만 용법 당신은 혜택을 얻지 못합니다.

두 번째는 루프를 통해 모든 사용의 최대 메모리를 사용합니다. std::vector::clear() 반드시 자유 메모리는 아닙니다. 즉, 전화하면 std::vector::capacity() 이전과 이후 std::vector::clear() 표준 준수 구현은 동일한 값을 반환 할 수 있습니다.

기껏해야 위의 체계와 함께 메모리를 할당하는 횟수를 줄입니다. 그러나 당신은 확실히 어떤 시점에서도 메모리 발자국을 줄이지 않을 것입니다. 예약 된 메모리로 축소하려면 벡터 스왑 관용구를 사용해야합니다.

std::vector<type>().swap(my_vector);
my_vector.reserve(stuff_count); 

또는 전체 효과가 동일하기 때문에 첫 번째 솔루션.

많은 추가 작업을 수행 해야하는 경우 std :: 벡터 대신 std :: deque를 사용하고 "push_back"을 사용하십시오.

어때요?

std::vector<DataType> my_vector;
my_vector.resize(sizeof(yourData));
memcpy(reinterpret_cast<char*>(&my_vector), &yourData, sizeof(yourData));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top