gpt4 book ai didi

c++ - 我什么时候应该真正使用 noexcept?

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

noexcept 关键字可以适本地应用于许多函数签名,但我不确定何时应该考虑在实践中使用它。根据我目前所读的内容,最后添加的 noexcept 似乎解决了移动构造函数抛出时出现的一些重要问题。但是,对于一些实际问题,我仍然无法提供令人满意的答案,这些问题促使我首先阅读了有关 noexcept 的更多信息。

  1. 有许多我知道永远不会抛出但编译器无法自行确定的函数示例。在所有此类情况下,我是否应该将 noexcept 附加到函数声明?

    必须考虑是否需要在每个 函数声明后附加noexcept 会大大降低程序员的工作效率(坦率地说,这会让人头疼) .在哪些情况下我应该更加小心地使用 noexcept,在哪些情况下我可以使用隐含的 noexcept(false)

  2. 在使用 noexcept 后,我什么时候才能真正期望观察到性能改进?特别是,给出一个代码示例,在添加 noexcept 之后,C++ 编译器能够生成更好的机器代码。

    就个人而言,我关心 noexcept,因为它为编译器提供了更多的自由来安全地应用某些类型的优化。现代编译器是否以这种方式利用 noexcept?如果没有,我是否可以期望他们中的一些人在不久的将来这样做?

最佳答案

我认为现在给出“最佳实践”答案还为时过早,因为还没有足够的时间在实践中使用它。如果在 throw specifiers 出来后立即询问这个问题,那么答案将与现在大不相同。

Having to think about whether or not I need to append noexcept after every function declaration would greatly reduce programmer productivity (and frankly, would be a pain).

好吧,那么在很明显该函数永远不会抛出时使用它。

When can I realistically expect to observe a performance improvement after using noexcept? [...] Personally, I care about noexcept because of the increased freedom provided to the compiler to safely apply certain kinds of optimizations.

似乎最大的优化 yield 来自用户优化,而不是编译器优化,因为可能会检查 noexcept 并对其进行重载。大多数编译器都遵循如果你不抛出异常处理方法就不会受到惩罚,所以我怀疑它会在你的代码的机器代码级别上改变很多(或任何东西),尽管可能通过删除来减少二进制大小处理代码。

在四大类中使用 noexcept(构造函数、赋值函数,而不是析构函数,因为它们已经是 noexcept)可能会带来最好的改进,因为 noexcept 检查在模板代码中是“常见的”,例如在 std 容器中。例如,std::vector 不会使用您的类的移动,除非它被标记为 noexcept(否则编译器可以推断出它)。

关于c++ - 我什么时候应该真正使用 noexcept?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31459947/

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