C++ 是否有必要为一个几乎什么都不做的函数编写noexcept?
如果我有这样的东西C++ 是否有必要为一个几乎什么都不做的函数编写noexcept?,c++,C++,如果我有这样的东西 struct A{ int x; constexpr A() : x(0){} constexpr void set(){ x = 0; } constexpr bool check()const{ return x == 5; } }; 写入设置和检查作为noexcept是否有任何好处/区别 概括来说:我是否需要编写只对整数类型执行操作的函数,如noexcept?noexcept有两个目的:它描述了一个接口,并且提高了性能。第一个是很重要的
struct A{
int x;
constexpr A() : x(0){}
constexpr void set(){ x = 0; }
constexpr bool check()const{ return x == 5; }
};
写入设置和检查作为noexcept
是否有任何好处/区别
概括来说:我是否需要编写只对整数类型执行操作的函数,如noexcept
?noexcept
有两个目的:它描述了一个接口,并且提高了性能。第一个是很重要的,即使函数很小,因为它记录了(在所有兼容版本中)即使实现变得更复杂(可能停止内联),它也将保持非抛出状态。该属性对于希望编写异常安全代码的客户机来说很重要(更改该属性可以悄悄地破坏它们)
第二个有两个组件:当主体简单且可用时,direct可能不受影响,但与类型相关联的库行为仅取决于其声明(考虑到接口思想,这是一件好事)。库倾向于只检查少数函数(特别是特殊成员函数)抛出的可能性,因此在这种情况下这不太重要,但请注意,“特殊”函数的空间会随着时间的推移而增加(例如,交换
,运算符==
)
结论是,当对人类读者或分析库很重要时,您应该编写noexcept
。取决于您打算如何使用数据结构和这些函数。声明这些函数noexcept
,如果从一个大型复杂函数调用它们(该函数也被指定为noexcept
),则使用起来会更方便。如果它们不是从这样一个函数中调用的,那就看你了。@Peter,我想,因为它们都是内联的,编译器将检查函数中的操作是否有noexcept
,因为它无论如何都会这样做;如果对整数类型进行运算,它们将被推导出,使我的noexcept
冗余。你对编译器将进行什么样的分析做出了一些重大假设。我一直认为这个关键字更像是对人类维护者的一个提示。