현재 내 컨테이너 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 :
reserve
기능은 std
과 같습니다.
Timer
은 내가 시간을 쉽게 측정하기 위해 만든 약간의 lib입니다. 과부하는 std::chrono
입니다.
try-catch
블록이 ~ 70ms이고 블록 주석이있는 ~ 18ms의 평균 시간은이 두 블록 사이의 큰 차이입니다.
그래서, 난이 try-catch
블록합니다 (_capacity
는 최종 푸시 후 _size
동일)에 도달하지 않고 시간을 증가 이유를 compilator인가 (2017 MSVC)를 알고있는 스택에 try-catch
블록을 미리 할당 할 사용하지 않는다면?
감사합니다.
NB : Visual Studio 2017 솔루션을 원한다면 보내 줄 수 있습니다.
교육받은 추측은 아니지만 인라인에 영향을 미치므로'try'-'catch '없이 실제 함수 호출없이 컴파일되지만 실제로는 함수 호출을 수행합니다. –
그래서'push_back' 선언 전에'_forceinline'을 시도해 봤지만 아무 것도 바뀌지 않습니다, 여전히 ~ 70ms입니다. 그래서 내가 당신의 가설을 테스트하기 위해 올바르게했는지 모르겠다. 단지 인라인이 컴파일러에 대한 힌트라는 것을 알고 있지만, 컴파일러가 동의하지 않더라도'_forceinline'은 함수를 인라인해야한다. – Natches
'_forceinline'이 여전히 인라인되지 않는 경우가 있습니다. 반대쪽을 시도해보고 컴파일 할 때'/ Ob0'을 사용하여 모든 인라인을 끕니다. –