std::vector<T> vec; // line #1
vec.reserve(100); // line #2
줄 # 1이 작은 할당 (예 : 10Th의 메모리)을 트리거하는지 또는 줄 2 번에 첫 번째 할당이 발생하는지 궁금합니다. 표준이 그것에 대해 아무 말도하지 않습니까?예약 용량에는 두 개의 할당이 필요합니까 아니면 하나만 할당합니까?
std::vector<T> vec; // line #1
vec.reserve(100); // line #2
줄 # 1이 작은 할당 (예 : 10Th의 메모리)을 트리거하는지 또는 줄 2 번에 첫 번째 할당이 발생하는지 궁금합니다. 표준이 그것에 대해 아무 말도하지 않습니까?예약 용량에는 두 개의 할당이 필요합니까 아니면 하나만 할당합니까?
구현이 정의되었습니다. vector
의 기본 생성자는 아무 것도 할당 할 필요가 없지만이를 구현하는 것은 허용됩니다.
스택의 벡터 컨테이너 공간 외에 할당을 트리거하지 않는 첫 번째 인스턴스 (일반적으로 할당 된 공간 및 사용 된 공간에 대한 정보가 모두 포함됩니다. 둘 다 0입니다). 그러나 힙 할당은 예약 할 때까지 발생하지 않습니다. ... 전형적으로.
이 표준은 말을하지 않습니다,하지만 당신은 당신의 시스템에 어떤 이상형을 찾을 수 있습니다
이vector<int> v;
cout << v.capacity() << endl;
v.reserve(100);
cout << v.capacity() << endl;
이 나에게 0
및 VS2008에 100
제공 - 즉 초기 벡터는 아무것도 할당되지했습니다.
편집 : 잘못된 조언을 삭제했습니다.
EDIT2 : 리틀 실험, 나는 호기심 때문에 ...
vector<int> w;
for (int i=0; i<100000; i++)
{
if (i == w.capacity())
cout << i << ", ";
w.push_back(i);
}
출력 :
0, 1, 2, 3, 4, 6, 9, 13, 19, 28, 42, 63, 94, 141, 211, 316, 474, 711, 1066,
1599, 2398, 3597, 5395, 8092, 12138, 18207, 27310, 40965, 61447, 92170,
대답의 첫 번째 절반은 +1, 두 번째 절반은 -1. 'w (100)'은'w()와는 다르다; w.reserve (100)'입니다. 왜냐하면 생성자 default를 사용하면 100 개의 요소가 생성되기 때문입니다. (즉, '크기'는 두 번째 예에서 구성한 후에도 100입니다.) –
오, 이런, 맞아요. 나는 그 비트를 제거 할 것이다. – tzaman
''vector''는''push_back''이 일정한 시간 복잡도를 상각 할 수 있다는 요구를 만족시키기 위해 기하 급수적으로 커집니다. 실험을 게시 한 이후의 FYI입니다. :-) –
일반적으로, 그래,하지만 표준이의 아무것도 말하지 않는다. –