我目前正在创建自己的容器Lib,但我发现无法访问(if语句无效)try-catch
阻止了运行时间的增加。
所以这是我的测试,
Vector.cpp :
template<class Type, class Allocator >
void vector<Type, Allocator >::push_back(Type&& ObjectToPushBack)
{
if (_capacity == _size)
{
#if 1
try
{
emplace_back(std::move(ObjectToPushBack));
}
catch (NullException& n)
{
std::cout << n.what() << std::endl;
throw n;
}
#endif
}
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
为int。
reserve
功能与std
中的功能类似。
Timer
是我创建的一个小库,可以轻松地测量时间,它超载std::chrono
。
try-catch
块的平均时间约为70毫秒,块被评论为~18毫秒,这两者之间存在较大差距。
所以,我想知道为什么这个try-catch
块会增加时间而不会达到(_capacity
仅在最后一次推送后等于_size
),是编译器(MSVC 2017) )即使未使用,也会在堆栈上预先分配try-catch
块?
注意:如果您需要Visual Studio 2017解决方案,我可以将其发送给您。
答案 0 :(得分:1)
当您添加catch
/ <div class="property-beds">
<strong>2</strong> beds
</div>
块时,编译器会添加代码以支持异常。这在函数头中执行(以及为局部变量分配空间和保存寄存器的代码)。对于MSVC,执行的一些异常支持似乎包括设置全局变量以指向本地异常数据,保存此指针的先前值,初始化局部变量以指示函数中的哪个try / catch块active,并设置另一个指向异常处理程序表的局部变量。
只要输入或退出try块,就会更新活动索引。
其他编译器可以采用不同的方式来处理异常。