- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
假设您有一个通常永远不会失败的函数,例如:
std::string convert_integer_to_string(int x);
原则上,这将是 noexcept
的候选者。但是,实现很可能涉及动态内存管理,因此它总是会抛出 std::bad_alloc。使用 new
运算符分配内存时。
是否建议将函数注释为noexcept?
从实际的角度来看,以合理的方式处理内存不足的情况是极其困难的。大多数程序只是假设有足够的可用内存。调用 std::terminate
,就像如果 noexcept
函数抛出 std::bad_alloc
时会发生的那样,在这种情况下似乎是合理的。
对我来说,noexcept
是某种形式的文档。这是一个 promise ,您(或优化器)可以安全地假设此函数永远不会抛出异常。如果您正在编写一个不关心内存不足情况的应用程序,它仍然是一个有效的假设。
我想最安全的建议是如果可能抛出 std::bad_alloc
异常,则永远不要使用 noexcept
。另一方面,我想知道无论如何使用 noexcept
是否有优势,假设您不关心内存不足的情况(即,如果 std::terminate
可以)。
最佳答案
如果函数可以出于任何原因抛出异常,即使它是 std::bad_alloc
,您应该不将其声明为 noexcept
.真正不能抛出异常并且实际上也很重要的函数相对较少。初级需要noexcept
功能是允许在异常情况下检测可用的错误恢复选项:例如,std::vector<T, A>
假设移动构造不会抛出,则可以在插入对象时使用移动构造。如果 move 构造可以抛出,则在实现强异常安全操作时,移动对象不能用于异常恢复。因此,如果类型 T
的移动构造可能失败std::vector<T, A>
的实例化不能移动对象,但需要复制它们。
特别是不要使用noexcept
作为虚假文档:如果函数实际上可以抛出,则违反契约(Contract)。系统在发生这种违规行为时会以某种程度的已定义行为使用react这一事实并不意味着您应该利用它。 ...虽然简单的程序可能不会恢复并且在内存不足时死掉,但真正的程序可能至少需要存储足够的状态来恢复它们死后留下的困惑,即,这对任何功能来说都是 Not Acceptable 做出终止程序的决定(当然,除非记录了该函数的意图)。
关于c++ - 从不将涉及动态内存分配的函数注释为 noexcept?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18176990/
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 6 年前。 Improve t
notificationCenterPublisher = NotificationCenter.default .publisher(for: .NSManagedObjec
我有以下 Rust 代码: #[inline(never)] fn x() -> i32 { 21 } pub fn main() -> i32 { x() } 如果没有优化 (-C
notificationCenterPublisher = NotificationCenter.default .publisher(for: .NSManagedObjec
我有以下 Rust 代码: #[inline(never)] fn x() -> i32 { 21 } pub fn main() -> i32 { x() } 如果没有优化 (-C
假设我的 ASPX 页面没有内联 C# 代码块。 所以,我可以安全地设置 ...在我的 web.config 文件中,不用担心编译错误。 就性能而言,使用以下设置是否会有任何损失? 即“自动”检测
应用程序.js var win1 = Titanium.UI.createWindow({ title:'Tab 1', backgroundColor: 'black', l
基本上,我正在为实现多级优先级队列的 xv6 内核实现一个调度程序。我有一个严重的问题,我不明白,我类(class)的助教不明白,我已经错过了这个项目的最后期限,所以现在帮助我不会给我任何加分 - 但
我想避免 git 自动 merge 我的 composer.json。这样我就可以在 develop 分支中有一个使用 dev-develop 包的 composer.json,而 master 中的
当比较两种不同的算法实现时(因此,不关心它们的绝对性能,而只关心相对性能)我是否最好强制 Java 只运行解释代码? 也就是说,打开 -Xint 标志会更好吗? 最佳答案 我不认为禁用 JIT 会更好
class A{ const size_t number; public: A(size_t number): number(number) {} void f(){
问题 寻找在以下之间切换的方法: 总是 从不 仅在静默模式下 仅当不处于静默模式时 这些选项在手机上的路径---菜单>>设置>>声音>>振动---找到。 通过手机导航很容易更改(顺便说一句,我的手机是
如何设置电源设置关闭:从不(关闭显示器=从不,让计算机进入休眠状态=从不),通过c#代码 最佳答案 这个问题中给出的链接可以告诉你一个方法。 Programmatically change Windo
我是一名优秀的程序员,十分优秀!