2017-11-12 8 views
2

현재 내 컨테이너 Lib을 만들고 있는데 도달 할 수없는 (무효 if 문) try-catch 블록이 런타임 시간을 늘린 것을 보았습니다. 그래서 여기미전도 된 try-catch 블록이 런타임 시간을 늘리는 이유는 무엇입니까?

template<class Type, class Allocator > 
void vector<Type, Allocator >::push_back(Type&& ObjectToPushBack) 
{ 
    if (_capacity == _size) 
    { 
     try 
     { 
      emplace_back(std::move(ObjectToPushBack)); 
     } 
     catch (NullException& n) 
     { 
      std::cout << n.what() << std::endl; 
      throw n; 
     } 
    } 
    else 
     emplace_back_no_except(std::move(ObjectToPushBack)); 
} 

Main.cpp :

int _cdecl main() 
{ 
    ctn::vector<TYPE> myvec; 

    Timer t; 

    myvec.reserve(NB); 

    auto f = [&]() {for (int i = 0; i < NB; ++i)myvec.push_back(TYPE());}; 

    t.timeThisFunction(f, ("My Vector Push Back " + std::to_string(NB) + " 
    Elements").c_str()); 
} 

NB은 10000000와 Type입니다

Vector.cpp :

는 int이며 내 테스트입니다.

reserve 기능은 std과 같습니다.

Timer은 내가 시간을 쉽게 측정하기 위해 만든 약간의 lib입니다. 과부하는 std::chrono입니다.

try-catch 블록이 ~ 70ms이고 블록 주석이있는 ~ 18ms의 평균 시간은이 두 블록 사이의 큰 차이입니다.

그래서, 난이 try-catch 블록합니다 (_capacity는 최종 푸시 후 _size 동일)에 도달하지 않고 시간을 증가 이유를 compilator인가 (2017 MSVC)를 알고있는 스택에 try-catch 블록을 미리 할당 할 사용하지 않는다면?

감사합니다.

NB : Visual Studio 2017 솔루션을 원한다면 보내 줄 수 있습니다.

+0

교육받은 추측은 아니지만 인라인에 영향을 미치므로'try'-'catch '없이 실제 함수 호출없이 컴파일되지만 실제로는 함수 호출을 수행합니다. –

+0

그래서'push_back' 선언 전에'_forceinline'을 시도해 봤지만 아무 것도 바뀌지 않습니다, 여전히 ~ 70ms입니다. 그래서 내가 당신의 가설을 테스트하기 위해 올바르게했는지 모르겠다. 단지 인라인이 컴파일러에 대한 힌트라는 것을 알고 있지만, 컴파일러가 동의하지 않더라도'_forceinline'은 함수를 인라인해야한다. – Natches

+0

'_forceinline'이 여전히 인라인되지 않는 경우가 있습니다. 반대쪽을 시도해보고 컴파일 할 때'/ Ob0'을 사용하여 모든 인라인을 끕니다. –

답변

1

try/catch 블록을 추가하면 컴파일러에서 예외를 지원하는 코드를 추가합니다. 이것은 함수 헤더에서 (지역 변수를위한 공간을 할당하고 레지스터를 저장하는 코드와 함께) 실행됩니다. MSVC에서 실행되는 예외 지원 중 일부는 로컬 예외 데이터를 가리 키도록 전역 변수를 설정하고이 포인터의 이전 값을 저장하며 함수에서 try/catch 블록을 나타내는 로컬 변수를 초기화하는 것으로 구성됩니다 활성 및 예외 처리기 테이블을 가리키는 다른 로컬 변수를 설정합니다.

활성 블록은 try 블록을 입력하거나 종료 할 때마다 업데이트됩니다.

다른 컴파일러는 예외 처리 방법이 다를 수 있습니다.