수조/용기를 초기화할 때 기본 구조 함수를 호출합니까 아니면 복제 구조 함수를 호출합니까

수조나 용기를 사용할 때 보통 일정한 용량을 미리 분배한다.분배의 크기에서 용기의 대상을 초기화할 수 있다. 첫 번째를 초기화할 때 기본 구조 함수를 호출하는 것은 의심할 여지가 없다. 그러나 두 번째부터 마지막까지 초기화할 때 어떻게 해야 하는가?
분명히 수조/용기의 대상은 똑같다. 한 가지 방법은 메모리를 열고 메모리에서 기본 구조 함수를 호출하는 것이다.다른 방법은 메모리를 열고 하나의 대상을 구성하여 대상을 n부로 복사하는 것이다. (복제 구조 함수를 호출한다.)효율적으로 볼 때 두 번째 효율은 더욱 높다고 생각한다. 왜냐하면 기본 구조를 호출하는 소모는 일반적으로 복제 구조 함수를 호출하는 것보다 많기 때문이다.복제 구조 함수는 종종 얕은 복사인데, 이렇게 하면 효율이 매우 높다.
코드를 써서 테스트해 봅시다. 우선 저는 VS2010을 사용했고 용기도 VS가 자체로 가지고 있습니다.
#include<iostream>
#include<vector>
class Test
{
public:
	Test()
	{
		std::cout << "Ctor" << std::endl;
	}
	Test(const Test& T)
	{
		std::cout << "Cptor" << std::endl;
	}
};
int main()
{
	std::cout << " " << std::endl;
	std::vector<Test> V(3);
	std::cout << " " << std::endl;
	Test T[3];

	return 0;
}

결과는 다음과 같습니다.
컨테이너 Ctor Ctor 배열 Ctor Ctor Ctor Ctor가 첫 번째 방법임이 분명합니다.
이후 용기는 SGI 버전의 STL5를 사용합니다.2 (헤드 파일 vector에서 SGI 버전으로 변경됨)
출력 결과는 다음과 같습니다.
컨테이너 Ctor Cptor Cptor 배열 Ctor Ctor Ctor Ctor 분명히 컨테이너는 두 번째 방법을 사용합니다.
다시 vector의 원본 코드에서 호출 과정을 볼 수 있습니다
explicit vector(size_type n) { fill_initialize(n, T()); }  
그것은 기본 구조 함수를 한 번 호출한 다음 n번 복사합니다.

좋은 웹페이지 즐겨찾기