gpt4 book ai didi

c++ - 为什么未到达的 try-catch block 会增加运行时时间?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:35 25 4
gpt4 key购买 nike

我目前正在创建自己的容器库,但我发现无法访问(无效的 if 语句)try-catch block 会增加运行时间。所以这是我的测试,

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 block 的平均时间约为 70 毫秒,注释 block 的平均时间约为 18 毫秒,这是两者之间的巨大差距。

所以,我想知道为什么这个 try-catch block 会增加未到达的时间( _capacity 等于 _size 只有在最后的插入),编译器(MSVC 2017)是否在堆栈上预先分配 try-catch block ,即使未使用?

注意:如果您想要 Visual Studio 2017 解决方案,我可以将其发送给您。

最佳答案

当您添加 try/catch block 时,编译器会添加代码以支持异常。这在函数头中执行(连同为局部变量分配空间和保存寄存器的代码)。使用 MSVC,执行的一些异常支持似乎包括设置一个全局变量以指向本地异常数据,保存该指针的先前值,初始化一个局部变量以指示函数中的哪个 try/catch block 是激活,并设置另一个指向异常处理程序表的局部变量。

只要进入或退出 try block ,事件索引就会更新。

其他编译器可以有不同的方式来处理异常。

关于c++ - 为什么未到达的 try-catch block 会增加运行时时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47244407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com