Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 除了在风格和表现上的练习,没有什么例外吗?_C++_C++11_Exception Handling_Coding Style_Noexcept - Fatal编程技术网

C++ 除了在风格和表现上的练习,没有什么例外吗?

C++ 除了在风格和表现上的练习,没有什么例外吗?,c++,c++11,exception-handling,coding-style,noexcept,C++,C++11,Exception Handling,Coding Style,Noexcept,我开始在我的代码中添加noexcept,但我想知道将它添加到内联函数是否明智。我假设优化器会在显然不需要的时候忽略运行时检查。。。但从人性化/风格的角度来看,是否值得向诸如getter、settings、increment函数等普通函数添加noexcept?我认为这是视觉上的混乱,因为有些东西非常明显。我正在讨论一条规则,即内联函数可以忽略noexcept,但是普通的.hpp/.cpp函数如果不抛出,就必须忽略noexcept 其次,我有大量代码根本无法抛出,因为它没有分配(在我的国际象棋引擎中

我开始在我的代码中添加
noexcept
,但我想知道将它添加到内联函数是否明智。我假设优化器会在显然不需要的时候忽略运行时检查。。。但从人性化/风格的角度来看,是否值得向诸如getter、settings、increment函数等普通函数添加noexcept?我认为这是视觉上的混乱,因为有些东西非常明显。我正在讨论一条规则,即内联函数可以忽略noexcept,但是普通的.hpp/.cpp函数如果不抛出,就必须忽略noexcept


其次,我有大量代码根本无法抛出,因为它没有分配(在我的国际象棋引擎中),不包含STL或任何可能失败的东西,所以成功总是有保证的。noexcept会不会因为运行时检查而减慢速度?是否有人使用宏在使用
noexcept
进行
DEBUG
构建之间切换,而在发布时切换到
throw()
,这只是编译时?如果内联函数是叶级函数,即它本身不调用函数,然后,理论上,编译器可以确定它不会抛出并忽略否则可能生成的任何异常处理。因此,就性能而言,它可能被证明是不必要的

话虽如此,您不应该期望通过添加
noexcept
看到性能降低。通过添加
noexcept
,无论必须生成何种代码来处理异常传播,都不会变得更加复杂。值得注意的是,如果从noexcept函数引发异常,则允许编译器完全忽略展开堆栈。这就是
noexcept
的直接好处的主要来源

<>对于样式推荐,首先,考虑<代码> NO>除< /代码>是否是接口的有用部分。由于算法原因,移动操作之类的操作可以从
noexcept
中受益匪浅,但除此之外,真正由您决定
noexcept
对您、您的界面和界面用户有何价值

如果这不能回答你的问题,请随意评论我的答案,我会进一步澄清


旁注:
throw()。如果通过声明为
throw()
的函数引发异常,则必须将堆栈完全释放给该函数的调用方。参见C++版本的N33 37中引用的关于此行为的7.5.2.1。< /P> < P>通过添加No.NoE或No.Objor(true)说明符到函数,请编译器添加运行时检查并调用STD:::终止。所以你有一个小的性能打击。你应该从中有所收获,否则我看不出有什么意义。标准库具有以下特点:

is_nothrow_constructible,
is_nothrow_default_constructible,
is_nothrow_move_constructible,
is_nothrow_copy_constructible,
is_nothrow_assignable,
is_nothrow_move_assignable,
is_nothrow_copy_assignable,
is_nothrow_destructible.
众所周知,标准库中的容器在包含的类型上使用这些特性来执行优化(移动而不是复制)。也许还有其他一些优化,我不知道。对于我来说,将noexcept说明符添加到适当的构造函数或赋值运算符(当然,如果它们真的没有抛出)是有意义的,当将类与标准容器一起使用时,这些特性将返回true,并获得性能提升

我不认为向getter或setter这样的普通函数添加noexcept是一个好主意:您获得了性能打击,却一无所获。
如果您的代码没有抛出并且没有使用标准库-我的建议是:根本不要使用noexcept

由于没有分配而根本无法抛出的代码
分配如何成为唯一的异常原因?什么是“运行时检查”?这可能会有帮助:@deviantfan:没有操作系统调用,没有分配。。。这是一个没有任何函数可以以任何方式失败的库。这是国际象棋计算。对于imo计算库来说,这是完全合理的。
noexcept
函数不需要展开,因此不需要保持在不可解状态。这就是优化的机会。我猜VC++违反了标准,它总是基于
throw()
进行优化。看见此外,您还没有解决处理noexcept的运行时违规的潜在成本。我仍然认为,像VC++已经提供的那样,单个编译器最终可能会提供一种“仅编译时”版本的
noexcept
,因此宏将是为每个编译器调整代码库的最佳方式。考虑到异常传播的潜在运行时成本和必要的堆栈展开,如果可以在错误抛出点确定它将通过声明为
noexcept
的函数传播,则允许程序立即终止,而不展开任何堆栈。对于基于表的异常处理方法,据我所知,这是可能的。比较遇到
noexcept
与否,在
noexcept
情况下可能会生成更高效的代码。这是否会带来性能上的胜利取决于所选编译器和相关程序的优化。当然,与
throw()
的VC++行为相比,
noexcept
在代码生成方面可能无法达到标准,但是遇到
noexcept
不会立即损坏您的程序。好的,感谢您确认我没有疯狂地认为noexcept从零开销的角度来看有点不完美。尽管吹毛求疵,但我想我会使用一个宏化的令牌来来回交换,至少只是为了获得并行的大规模性能测量。将其添加到所有代码中需要一段时间。不用担心。如果你能在其他平台上找到类似的功能,那么我可以看出这在某些情况下是有用的。就预期行为而言