我在gcc中滥用异常作为流控制,有没有办法让它发出一些优化的代码?
shiny f(legacy const &l)
try
{
auto convert_i = [](int i) -> int
{
switch(i)
{
case 1: return 5;
case 2: return 9;
default: throw 0;
}
};
return shiny
{
.i = convert_i(l.i)
};
}
catch(int)
{
return shiny { .invalid = true };
}
所以我有很多异常,这些都是在填充一个结构体时使用的,几乎所有这些都可能失败,所以写这些没有异常的代码将是一个冗长的混乱。同时,异常永远不会离开当前函数,编译器生成异常处理代码的唯一原因就是给予调试器干预的机会。
这个项目使用gcc作为编译器,并且不太可能改变。生成的代码使用大量的空间来构造,抛出,捕获和忽略异常对象,这可以避免吗?
2条答案
按热度按时间iq3niunx1#
将您的代码更改为使用
std::optional
将能够完全删除异常路径。有几种方法可以做到这一点,但是代码的一个相当直接的翻译可能看起来像这样:vxqlmq5t2#
我想对你问题的前提提出质疑。你说 “所以写这段没有异常的代码将是一个冗长的混乱”.但这是真的吗那么,以下几点呢?
除此之外:我大胆猜测,所有这些本地的数据也会导致大量的开销。为什么不把它们变成带输出参数
bool &conversion_failed
的静态函数呢?不需要捕获局部变量和生成临时函数指针(除非它们被gcc优化掉)。