객체 선언 성능

Jan 03 2021

나는 일종의 대학 정복을 코딩하고 있었고 아래와 같은 루프에서 맵을 선언했을 때 무언가를 발견했습니다.

for (int i = 0; i < n; i++)
{
    map<int, bool> hashMap;
    //...
}

다음보다 더 많은 시간이 걸립니다.

map<int, bool> hashMap;
for (int i = 0; i < n; i++)
{
    hashMap.clear();
    //...
}

그래서 루프에서 객체를 선언하는 것이 단순히 다시 초기화하는 것보다 성능이 떨어지는 이유가 궁금합니다.

답변

2 dxiv Jan 04 2021 at 10:59

코드의 첫 번째 버전에서는 생성자와 소멸자가 시간 hashMap으로 호출 n되고 두 번째 버전에서는 한 번만 호출됩니다.

당연한 질문은 새로운 map객체를 파괴하고 구성하는 것이 하나의 동일한 객체를 지우고 재사용하는 것과 비교하여 눈에 띄게 다른 이유 입니다. 이것은 map사용되는 구현 의 실제 코드를 검사함으로써 만 확실하게 대답 할 수 있으므로 다음은 그럴듯한 추측 일뿐입니다.

std::map일반적으로 사용하여 구현됩니다 레드 - 블랙 트리를 , 그리고 그것은 사용하기 레드 - 블랙 트리 구현을위한 일반적인 감시 , NIL 잎에 대한 노드를 예를 들어 볼 레드 블랙 트리에서 감시 림프절의 혜택? . 이 센티넬은 트리가 생성 될 때마다 할당 된 다음 파괴시 해제되어야합니다. 반대로 clear'ing a map는 대신 트리를 비우지 만 연관된 내부 객체를 재사용합니다.

이러한 구현의 실제 예를 들어, Microsoft의 _Tree생성자는 적절한 이름의 _Alloc_sentinel_and_proxy();. map에서 파생 되므로 객체가 생성 _Tree될 때마다 호출됩니다 map.