【问题标题】:Is it necessary to write noexcept for a function that does almost nothing?是否有必要为几乎什么都不做的函数编写 noexcept ?
【发布时间】:2019-12-01 17:25:12
【问题描述】:

如果我有这样的事情

struct A{
    int x;
    constexpr A() : x(0){}
    constexpr void set(){ x = 0; }
    constexpr bool check()const{ return x == 5; }
};

setcheck 写成noexcept 有什么好处/区别吗?

概括地说:我是否需要编写只对整数类型执行操作的函数,如noexcept

【问题讨论】:

  • 取决于你打算如何使用你的数据结构和那些函数。声明这些函数 noexcept 如果它们是从一个也指定为 noexcept 的大型复杂函数调用的,那么生活会更轻松。如果不从此类函数中调用它们,则由您决定。
  • @Peter,我想,既然它们都将被内联,编译器会检查函数内部的操作是否有noexcept,因为无论如何它都会这样做;如果对整数类型进行操作,它们将被推导出noexcept,使我的noexcept 多余
  • 您正在对编译器将进行的分析做出一些宏大的假设。
  • 我一直认为这个关键字更像是对人类维护者的暗示。

标签: c++


【解决方案1】:

noexcept 有两个用途:描述接口,并提高性能。第一点很重要,即使函数很简单,因为它记录了(在所有兼容版本中)即使实现变得更复杂(并且可能停止内联),它也将保持不抛出异常。该属性对于想要编写异常安全代码的客户端很重要(并且更改它可以静默地破坏它们)。

第二个有两个组成部分:虽然直接code generation 在主体简单且可用时可能不受影响,但与类型关联的库行为仅取决于其声明(考虑到接口思想,这是一件好事)。库倾向于只检查少数函数(尤其是特殊成员函数)抛出的可能性,因此在这种情况下这不太重要,但请注意“特殊”函数的空间随着时间的推移而增长(例如,swapoperator==)。

结论是你应该在重要的时候写noexcept——无论是对你的人类读者还是对你的分析库。

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2015-10-29
    • 2012-09-12
    • 1970-01-01
    • 2020-09-10
    • 2011-01-25
    相关资源
    最近更新 更多