[c++] C ++에서 std :: resize (n)과 std :: shrink_to_fit의 차이점은 무엇입니까?

나는이 진술들을 보았습니다.

resize(n)– ‘n’요소를 포함하도록 컨테이너의 크기를 조정합니다.
shrink_to_fit()– 크기에 맞게 컨테이너 용량을 줄이고 용량을 초과하는 모든 요소를 ​​파괴합니다.

이 기능들 사이에 중요한 차이점이 있습니까? 그들은 C ++에서 벡터 아래에옵니다.



답변

벡터에는 다른 것을 의미하는 두 개의 “길이”속성이 있습니다.

  • size벡터에서 사용 가능한 요소의 수입니다. 저장 한 수입니다. 이것은 개념적 길이입니다.
  • capacity 벡터가 현재 할당 한 메모리 양에 맞는 요소 수입니다.

capacity >= size항상 사실이어야하지만, 그들이 항상 평등 할 이유는 없습니다. 예를 들어, 요소를 제거 할 때 할당을 줄이면 버킷 하나를 작게 할당하고 나머지 내용을 “할당, 이동, 해제”로 새 할당을 만들어야합니다.

마찬가지로 capacity == size요소를 추가하고 추가하면 벡터가 하나의 요소 (다른 “할당, 이동, 자유”연산)만큼 할당을 늘릴 수 있지만 일반적으로 두 개 이상의 요소를 추가하게됩니다. 용량을 늘려야하는 경우 벡터는 용량을 둘 이상 증가 시켜 모든 요소를 ​​다시 이동하기 전에 여러 개의 요소를 추가 할 수 있습니다.

이 지식으로 귀하의 질문에 답변 할 수 있습니다.

  • std::vector<T>::resize()배열 의 크기 를 변경합니다 . 현재 크기보다 작게 크기를 조정하면 초과 객체가 파괴됩니다. 현재 크기보다 크게 크기를 조정하면 끝에 추가 된 “새”개체가 기본적으로 초기화됩니다.
  • std::vector<T>::shrink_to_fit()현재 크기와 일치하도록 용량 을 변경 하도록 요청합니다 . (이 구현은 이 요청을 이행 하지 않을 수도 있고 그렇지 않을 수도 있습니다. 용량을 줄이지 만 크기와 같지 않을 수도 있습니다. 전혀 수행하지 않을 수도 있습니다.) 요청이 이행되면 사용되지 않은 부분 중 일부 또는 전부가 삭제됩니다. 벡터의 할당 일반적으로 벡터 작성을 마치면 다른 항목을 추가하지 않습니다. (추가 할 항목 수를 미리 알고 있다면 아무 것도 std::vector<T>::reserve()하지 않고 항목을 추가하기 전에 벡터에 알리는 것이 좋습니다 shrink_to_fit.)

따라서 벡터에 개념적으로 얼마나 많은 것들이 있는지resize() 변경 하는 데 사용 합니다 .

shrink_to_fit()벡터 에 개념적으로 얼마나 많은 것들이 있는지 변경 하지 않고 벡터가 내부적으로 할당 한 초과 공간을 최소화하기 위해 사용 합니다 .


답변

shrink_to_fit() – 크기에 맞게 컨테이너 용량을 줄이고 용량을 초과하는 모든 요소를 ​​파괴합니다.

그것은 무슨 일이 일어 났는지에 대한 오해입니다. 분명히, 용량 부분 이외의 모든 요소를 ​​파괴하면 정확하지 않습니다.

C ++에서 동적 메모리가 객체에 사용되는 경우 두 단계가 있습니다.

  1. 메모리는 객체에 할당됩니다.
  2. 메모리 위치에서 객체가 초기화 / 구성됩니다.

동적으로 할당 된 메모리의 객체가 삭제되면 두 단계가 있으며,이 단계는 구성 단계를 반영하지만 반대 순서로 수행됩니다.

  1. 메모리 위치의 객체가 손상되었습니다 (내장 유형의 경우 이것은 noop입니다).
  2. 객체가 사용하는 메모리가 할당 해제됩니다.

컨테이너 크기 를 넘어 할당 된 메모리 는 버퍼입니다. 제대로 초기화 된 개체를 보유하지 않습니다. 그것은 단지 원시 메모리입니다. shrink_to_fit()추가 메모리가 없지만 해당 위치에 객체가 없는지 확인하십시오. 따라서 아무것도 파괴되지 않고 메모리 만 할당 해제됩니다.


답변

C ++ 표준에 따르면 shrink_to_fit

효과 : shrink_to_fit은 capacity ()를 size ()로 줄이기위한 바인딩이 아닌 요청입니다.

그리고 resize

효과 : sz <size () 인 경우 시퀀스에서 마지막 size ()-sz 요소를 지 웁니다. 그렇지 않으면 sz-size () 기본 삽입 요소를 순서에 추가합니다.

기능이 다른 일을하는 것은 분명합니다. 또한 첫 번째 기능에는 매개 변수가없고 두 번째 기능에는 두 개의 매개 변수가 있습니다. shrink_to_fit메모리를 재 할당 할 수 있지만 함수 는 컨테이너의 크기를 변경하지 않습니다.


답변