@Marc은 (내 생각에 따라) 훌륭한 분석을 제공했지만 일부 사람들은 약간 다른 각도에서 사물을 고려하는 것을 선호 할 수 있습니다.
하나는 재 할당을 수행하는 약간 다른 방법을 고려하는 것입니다. 이전 스토리지에서 새 스토리지로 모든 요소를 즉시 복사하는 대신 한 번에 하나의 요소 만 복사하는 것이 좋습니다. 즉, push_back을 수행 할 때마다 새 요소가 새 공간에 추가되고 기존 요소는 정확히 하나만 복사됩니다. 이전 공간에서 새 공간으로의 요소. 성장률이 2라고 가정하면 새 공간이 가득 차면 모든 요소를 이전 공간에서 새 공간으로 복사했음을 알았으며 각 push_back은 정확히 일정한 시간이었습니다. 이 시점에서 이전 공간을 버리고 두 배나 큰 게인 인 새로운 메모리 블록을 할당하고 프로세스를 반복합니다.
분명히, 우리는 이것을 무한정 계속 사용할 수 있습니다 (또는 사용 가능한 메모리가있는 한). 모든 push_back에는 새로운 요소 하나를 추가하고 하나의 오래된 요소를 복사하는 것이 포함됩니다.
일반적인 구현에는 여전히 동일한 수의 사본이 있지만 한 번에 하나씩 사본을 수행하는 대신 모든 기존 요소를 한 번에 복사합니다. 한편으로는, 맞습니다. 즉, push_back의 개별 호출을 보면 일부가 다른 것보다 상당히 느리다는 것을 의미합니다. 그러나 장기 평균을 보면 벡터의 크기에 관계없이 push_back 호출 당 수행되는 복사량은 일정하게 유지됩니다.
계산 복잡성과 관련이 없지만 push_back 당 하나의 요소를 복사하는 대신 push_back 당 시간이 일정하게 유지되는 대신 작업을 수행하는 것이 유리한 이유를 지적하는 것이 좋습니다. 고려해야 할 이유가 3 가지 이상 있습니다.
첫 번째는 단순히 메모리 가용성입니다. 이전 메모리는 복사가 완료된 후에 만 다른 용도로 사용할 수 있습니다. 한 번에 하나의 항목 만 복사하면 이전 메모리 블록이 훨씬 더 오래 할당됩니다. 실제로, 항상 하나의 오래된 블록과 하나의 새로운 블록이 항상 할당됩니다. 2보다 작은 성장 인자 (일반적으로 원하는)를 결정했다면 항상 더 많은 메모리를 할당해야합니다.
둘째, 한 번에 하나의 이전 요소 만 복사 한 경우 배열에 대한 색인 작성은 약간 까다로울 수 있습니다. 각 색인 작업은 주어진 색인의 요소가 현재 이전 메모리 블록에 있는지 또는 새로운. 어떤 방법으로도 복잡하지는 않지만 배열 인덱싱과 같은 기본 작업의 경우 거의 모든 속도 저하가 심각 할 수 있습니다.
셋째, 한 번에 모두 복사하면 캐싱을 훨씬 더 잘 활용할 수 있습니다. 한 번에 모두 복사하면 대부분의 경우 소스와 대상이 모두 캐시에있을 것으로 예상 할 수 있으므로 캐시 누락 비용은 캐시 라인에 맞는 요소 수만큼 상각됩니다. 한 번에 하나의 요소를 복사하면 복사하는 모든 요소에 대해 캐시 누락이 쉽게 발생할 수 있습니다. 이는 복잡성이 아니라 상수 요소 만 변경하지만 여전히 상당히 중요 할 수 있습니다. 일반적인 머신의 경우 10 ~ 20의 요소를 쉽게 기대할 수 있습니다.
실시간 요구 사항이있는 시스템을 설계하는 경우 한 번에 하나의 요소 만 복사하는 것이 합리적 일 수 있습니다. 전체 속도는 낮을 수도 있고 아닐 수도 있지만, 한 번의 push_back 실행에 걸리는 시간에는 여전히 상한이 있습니다. 실시간 할당자가 있다고 가정합니다 (물론 많은 실시간 시스템은 단순히 실시간 요구 사항이있는 부분에서 메모리의 동적 할당을 금지합니다.