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

时间:2017-11-12 00:51:59

标签: c++ try-catch

我目前正在创建自己的容器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解决方案,我可以将其发送给您。

1 个答案:

答案 0 :(得分:1)

当您添加catch / <div class="property-beds"> <strong>2</strong> beds </div>块时,编译器会添加代码以支持异常。这在函数头中执行(以及为局部变量分配空间和保存寄存器的代码)。对于MSVC,执行的一些异常支持似乎包括设置全局变量以指向本地异常数据,保存此指针的先前值,初始化局部变量以指示函数中的哪个try / catch块active,并设置另一个指向异常处理程序表的局部变量。

只要输入或退出try块,就会更新活动索引。

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