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


11

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

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

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


resize는 컨테이너의 크기를 수정하지만 shrink_to_fit은 수정하지 않습니다. 일반적인 사용법의 경우 shrink_to_fit에 대해 알 필요가 없으며 개발자가 코드 성능을 수동으로 향상시킬 수 있어야합니다.
NoSenseEtAl

2
표준 용기는 크기용량이 있습니다. 크기는 컨테이너의 현재 요소 수이며 용량은 대략적으로 할당 된 메모리의 양입니다. 크기를 조정하면 크기가 shrink_to_fit변경되고 용량이 변경됩니다.
일부 프로그래머 친구

2
당신은 차이 이해 하는가 capacitysize?
큐빅

답변:


12

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

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


2
그것은 shrink_to_fit전부 또는 아무것도 아닙니다. 구현은 용량을 일부 줄일 수 있습니다. 예를 들어 벡터 용량을 2의 거듭 제곱으로 제한하는 구현을 고려하십시오.
François Andrieux

5

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

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

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

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

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

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

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


2

C ++ 표준에 따르면 shrink_to_fit

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

그리고 resize

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.