我正在观看C++中的系统错误处理 - Andrei Alexandrescu他声称这Exceptions in C++非常非常慢.
我想知道这是否仍然适用 C++98
我一直是一名嵌入式软件工程师,但通常在OSI堆栈的第3层或第2层.我不是一个硬件家伙.我一般都经常使用电信产品,通常是手机/手机,这通常意味着像ARM 7处理器.
现在我发现自己处于一个更通用的嵌入式世界中,在一个小型的初创公司中,我可能会转向"不那么强大"的处理器(这是主观位) - 我无法预测哪个.
我已经阅读了很多关于在嵌入式系统中使用C++在C++中的争论,而且没有明确的答案.有一些关于可移植性的小担忧,还有一些关于代码大小或运行时的问题,但我有两个主要问题:
1 - 异常处理; 我仍然不确定是否使用它(参见嵌入式C++:是否使用异常?)
2 - 我非常不喜欢嵌入式系统中的动态内存分配,因为它可能会引入问题.我通常有一个缓冲池,它在编译时静态分配,只提供固定大小的缓冲区(如果没有缓冲区,系统复位).当然,STL会进行大量的动态分配.
现在我必须决定是否使用或放弃STL - 对于整个公司,永远(它进入一些非常核心的s/w).
我跳哪个方向?超级安全并且失去了很多构成C++的东西(imo,它不仅仅是语言定义),可能会在以后遇到问题,或者现在必须添加大量的异常处理和其他一些代码?
我很想和Boost一起去,但是1)我不确定它是否会移植到我可能想要使用的每个嵌入式处理器上2)在他们的网站上,他们说他们不保证/推荐它的某些部分对于嵌入式系统(尤其是FSM,这似乎很奇怪).如果我选择Boost,我们会在以后发现问题....
我已经读过,使用C++异常进行异常处理有一些开销,而不是检查返回值.我只是谈论没有抛出异常时产生的开销.我还假设您需要实现实际检查返回值的代码并执行相应的操作,无论它与catch块的作用相同.并且,将异常对象与内部45个状态变量抛出的代码与为每个错误返回负整数的代码进行比较也是不公平的.
我不是仅仅基于哪个可以更快地执行来构建支持或反对C++异常的情况.我听到有人最近提出这样的情况:一旦你考虑了检查返回值和处理错误所需的所有额外簿记代码,使用异常的代码应该像基于返回代码的代码一样快.我错过了什么?
我正在阅读谷歌C++风格指南,并在例外部分感到困惑.根据指南,使用它的一个缺点是:
异常安全需要RAII和不同的编码实践.需要大量的支持机制才能使编写正确的异常安全代码变得容易.此外,为了避免要求读者理解整个调用图,异常安全代码必须将写入持久状态的逻辑隔离到"提交"阶段.这将带来好处和成本(可能是您被迫混淆代码以隔离提交的地方).允许例外将迫使我们总是支付这些费用,即使它们不值得
具体来说,我不明白的陈述是这样的:
(...)异常安全代码必须将写入持久状态的逻辑隔离到"提交"阶段.
还有这个:
(...)也许你被迫混淆代码来隔离提交(...).
我想我不习惯术语"持久状态","提交阶段","混淆代码以隔离提交".关于这些术语的一些小解释,例子或参考可能是很好的,也可能是为什么这是真的.
我听说有趣的是,即使没有异常发生,在C++中使用"try"块也会在运行时减慢代码的速度.我搜索过,但一直无法找到任何解释或证据.有谁知道这是否属实,若有,为什么?
我有以下简单的情况突然出现在这个地方.大量请求带有如下功能签名的设备:
Err execute( const ICommandContext &context,
const RoutineArguments &arguments,
RoutineResults &results)
Run Code Online (Sandbox Code Playgroud)
基本上有一个请求处理服务器,它将调用它来执行具有这些签名的各种请求类型的函数.在出错的情况下,我们有2条返回路径.
Err输出类型(认为它是相当于int),这是用来通知了毛病就是与系统,不要求做服务器或系统.在处理用户请求之前,始终将其排序在函数顶部.RoutineResults提供setStatus可用于将请求的失败信息返回给客户端的功能.出于这个原因,我们有很多这种类型的代码弹出:
// Failure due to request
Err error = someFunctionCall(clientInput);
if (!error.success()) {
results.setStatus(error); // Inform the client of the error
return SUCCESS; // Inform the system that we are all good
}
Run Code Online (Sandbox Code Playgroud)
我们有一个特定的请求类型,其中包含15参数,这些参数是在系统周围发出的.我们在概念上需要15 if error do套这看起来很浪费.如果我们需要通过并改变我们返回的方式,它也容易出错.我们如何有效地委托setStatus和返回只需要在函数中发生一次的少量代码?
一个c系统可能与宏解决这个问题,是这样的:
#define M_InitTry Err error
#define M_Try(statement) if (!(error = statement).success()) { …Run Code Online (Sandbox Code Playgroud) 我有一些C++项目,它们不使用异常处理.
添加有什么好处-fno-exceptions,或者gcc是否认为我不使用异常(也没有使用异常的库)?
异常处理会产生开销成本(据我所知)....我很欣赏IF语句/分支可能会导致代码变慢.但是,假设您的程序在99.9%的时间内正确运行,分支预测器将在大多数情况下正确猜测,并且您不需要整个程序中的异常处理开销......
因此,在性能关键型应用程序中,使用IF语句而不是传统的异常处理来检测错误会更好吗?
c++ ×8
c++03 ×1
embedded ×1
exception ×1
g++ ×1
gcc ×1
optimization ×1
overhead ×1
performance ×1
stl ×1