Google的Go语言作为一种设计选择没有例外,Linux的Linus称之为例外废话.为什么?
我已经读过,使用C++异常进行异常处理有一些开销,而不是检查返回值.我只是谈论没有抛出异常时产生的开销.我还假设您需要实现实际检查返回值的代码并执行相应的操作,无论它与catch块的作用相同.并且,将异常对象与内部45个状态变量抛出的代码与为每个错误返回负整数的代码进行比较也是不公平的.
我不是仅仅基于哪个可以更快地执行来构建支持或反对C++异常的情况.我听到有人最近提出这样的情况:一旦你考虑了检查返回值和处理错误所需的所有额外簿记代码,使用异常的代码应该像基于返回代码的代码一样快.我错过了什么?
这个问题对于嵌入式开发尤为重要.异常处理为生成的二进制输出增加了一些空间.另一方面,没有例外,错误需要以其他方式处理,这需要额外的代码,这最终也会增加二进制大小.
我对你的经历很感兴趣,特别是:
请仅以我的问题为指导.欢迎任何输入.
附录:对于特定的C++对象/可执行文件,是否有任何人具有具体的方法/脚本/工具,它将显示由编译器生成的代码和专用于异常处理的数据结构占用的已加载内存占用的百分比?
这个链接指出,
为了捕获异常,我们必须将一部分代码置于异常检查之下.这是通过将该部分代码包含在try块中来完成的.当在该块内出现异常情况时,抛出异常将控制转移到异常处理程序.如果没有抛出异常,代码将继续正常运行并忽略所有处理程序.
这是否意味着由于在运行时"检查"的额外任务,使用try块会降低性能?
我编写了一个测试来测量带有线程的C++异常的成本.
#include <cstdlib>
#include <iostream>
#include <vector>
#include <thread>
static const int N = 100000;
static void doSomething(int& n)
{
--n;
throw 1;
}
static void throwManyManyTimes()
{
int n = N;
while (n)
{
try
{
doSomething(n);
}
catch (int n)
{
switch (n)
{
case 1:
continue;
default:
std::cout << "error" << std::endl;
std::exit(EXIT_FAILURE);
}
}
}
}
int main(void)
{
int nCPUs = std::thread::hardware_concurrency();
std::vector<std::thread> threads(nCPUs);
for (int i = 0; i < nCPUs; ++i)
{
threads[i] …Run Code Online (Sandbox Code Playgroud) 一般来说,我倾向于使用try/catch代码,这些代码具有多个故障点,故障具有公共处理程序.
根据我的经验,这通常是在执行某些操作后执行某些操作或输出之前限定输入或上下文的代码.
我收到了文献和同事的建议,以尽量减少这些块中的代码,我接受这一点作为一般的好建议.
我想更多地了解上述建议的基础:
在此先感谢您的帮助,
AJ
我已经阅读了很多关于C++异常和我看到的内容,特别是异常性能是一个难题.我甚至试图在g ++的内幕下看看如何在汇编中表示异常.
我是C程序员,因为我更喜欢低级语言.前段时间我决定使用C++而不是C,因为它的成本很低,它可以让我的生活更轻松(类比结构,模板等).
回到我的问题,因为我看到异常只会在它们发生时生成开销,因为它需要一长串的跳转和比较指令才能找到合适的异常处理程序.在正常的程序执行中(没有错误),异常开销等于正常的返回代码检查.我对吗?
我经常读到异常有点慢,如果性能是一个问题应该避免(例如,在Java,F#等).这是否适用于常见的OCaml函数,例如Hashtbl.find,返回未找到元素的异常?
特别是,如果我希望我的应用程序有效,我应该总是使用,例如,Hashtable.mem在调用之前测试元素成员资格Hashtbl.find吗?或者mem功能的额外比较是否会对性能产生负面影响?
我一直在寻找一种方法来确定我的字符串值是否是一个有效的双倍,而我还没有找到一种方法也不会拒绝一个带有一个点的数字...
在我的搜索中,我找到了这个
而Charles Salvia给出的答案是
bool is_number(const std::string& s)
{
std::string::const_iterator it = s.begin();
while (it != s.end() && std::isdigit(*it)) ++it;
return !s.empty() && it == s.end();
}
Run Code Online (Sandbox Code Playgroud)
这适用于任何没有点的数字,但有点的数字会被拒绝...
Swift Docs中有一条说明如下:
Swift中的错误处理类似于其他语言中的异常处理,使用了try,catch和throw关键字.与许多语言中的异常处理不同 - 包括Swift中的Objective-C-error处理不涉及展开调用堆栈,这可能是计算上昂贵的过程.因此,throw语句的性能特征与return语句的性能特征相当.
在Swift和Obj-c中展开调用堆栈意味着什么?这里的相关问题,但它是C++特定的.我知道调用栈是什么,但想要更详细地解释unwinding.
如果Swift没有展开调用堆栈,它会做什么呢?
为什么这在计算上会很昂贵?
总结:我想更好地理解异常如何工作以及Swift中的执行流程.