gpt4 book ai didi

c++ - 同一函数中的异常处理会使编译时间减慢 2 倍以上,为什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:47 26 4
gpt4 key购买 nike

我有一个数千行的项目,其中有一个巨大的 main(~800 行)。
包含 main 函数的文件需要 7.94 秒才能编译。

代码结构如下:

int main(int argc, char *argv[])
{
int result = 0;
try
{
/* 800 lines of code here */
}
catch (std::invalid_argument const &ex)
{
std::cerr << ex.what() << std::endl;
return EINVAL;
}
catch (std::runtime_error const &ex)
{
std::cerr << ex.what() << std::endl;
return -1;
}
return 0;
}

但是,当我简单地把它改成

void run(int argc, char *argv[])
{
/* 800 lines of code here */
}

int main(int argc, char *argv[])
{
int result = 0;
try
{
run(argc, argv);
}
catch (std::invalid_argument const &ex)
{
std::cerr << ex.what() << std::endl;
return EINVAL;
}
catch (std::runtime_error const &ex)
{
std::cerr << ex.what() << std::endl;
return -1;
}
return 0;
}

编译时间减少到 2.48 秒!

我可以看出罪魁祸首是异常处理代码,因为当我删除周围的 try/catch 时,我得到了同样的编译时间减少。

此外,如果我将 run 函数标记为 __forceinline,编译时间增加到 10.02!但是,如果我在取出 try/catch 之后执行此操作,那么它会下降到仅仅 3.27 秒。

但是什么给了?当代码直接位于 try block 的主体内时,编译器究竟需要做什么才能使计算密集度变得如此之高?

注意事项:

  • 我在 RELEASE 模式下编译
  • Microsoft Visual C++ 2013 年 11 月 CTP 编译器(原生 x64)
  • 相关编译器选项:/O2/Gm-/GS/EHsc(去掉/EHsc也可以加快编译速度)

最佳答案

我怀疑差异与额外的清理代码有关。在函数中声明的 C++ 对象在离开它时被销毁,因此它们的销毁代码已经在函数结尾处并且(我认为)堆栈展开 - 异常处理过程的一部分 - 可以使用该代码。如果您需要在 离开函数的情况下销毁所有这些对象 - 需要生成和管理额外的销毁代码,这会影响构建时间和二进制大小。你能说二进制大小是否有差异吗?

虽然坦率地说,我很惊讶影响(时间/规模)是可以衡量的。 “800 行”在 C++ 对象创建方面是否特别丰富? (也许是间接的)

关于c++ - 同一函数中的异常处理会使编译时间减慢 2 倍以上,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24856214/

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