- 主题:大家都用C++的try catch吗?
其实绝大多数选用C++的人,追求的是zero-cost抽象:手上写的高等语法,脑子里盘算着这么写最后生成出来的机器语言会不会不完美。人家连用虚函数还是模板函数,都要纠结半天到底是要快几个cpu cycle还是省几个exe byte。
C++的exception是违背这种zero-cost抽象的。try-catch的语法加上RAII,一不小心就能让
catch部分本来就罗嗦的代码产生一堆副本,洁癖的人是受不了的。
这可能是绝大多数C++的库作者都不用异常的最大原因。
从汇编写到C写到C++的人,是不可能接受异常的。用异常的多半是java出身,学了点js,最后过来写C++的人,而且肯定不懂汇编的。
【 在 z16166 的大作中提到: 】
: 你试图用某几个项目没有使用异常,来证明异常不靠谱,这本身是个错误的推理。
: 因为按你这个推理,只有100%的项目都使用了异常,才能证明异常是靠谱的。
: "unreal engine没使用异常,是因为游戏帧数有响应时间要求",这是我拍脑袋的分析。对错与否,可以继续辩。
: 实际上,性能问题是unreal关注的重点之一。它自己的编码规范写的:
: "从历史上看,UE 避免直接使用 C 和 C++ 标准库。造成这种情况的原因有几个,包括:用我们自己的实现替换缓慢的实现,允许对内存分配进行额外的控制,在广泛可用之前添加新功能,进行理想但非标准的行为更改,在整个代码库中具有一致的语法,或者避免与 UE 的习惯用法不兼容
: 墓乖臁H欢昀矗曜伎獗涞酶游榷ê统墒欤⑶野宋颐遣幌胗贸橄蟛惆盎蜃约褐匦率迪值墓δ堋"
: 以上是unreal不使用某些C/C++特性的原因。在unreal早期开发时,C/C++的很多基础设施还不够好,包括跨平台的异常支持,但是一旦C/C++的标准实现比unreal自己撸的还要好时,它也是允许提出替换的,是开放的。
: C++抛出异常时确实有开销,而且可能还不小,这个我也没否认,所以才会认为可能影响游戏帧数响应。
: 不光是反射,unreal还有GC,这是它自己的balance,牺牲一点性能换取其他好处。能支持脚本开发,就是为了享用脚本开发的便利性和扩展性。
--
FROM 114.93.56.*
这个说法有点问题,
boost库的那些作者基本都是c++ expert,是用异常的,
推荐用异常的是几个c++ guru,
楼上一些嚷嚷c++异常开销大的,对现在编译器的try是近乎zero-cost反而不知道,只是凭感觉而罔顾事实,或者停留在以前的印象。
【 在 javaboy 的大作中提到: 】
: 其实绝大多数选用C++的人,追求的是zero-cost抽象:手上写的高等语法,脑子里盘算着这么写最后生成出来的机器语言会不会不完美。人家连用虚函数还是模板函数,都要纠结半天到底是要快几个cpu cycle还是省几个exe byte。
: C++的exception是违背这种zero-cost抽象的。try-catch的语法加上RAII,一不小心就能让
: catch部分本来就罗嗦的代码产生一堆副本,洁癖的人是受不了的。
: ...................
--
FROM 222.128.162.*
刻画得相当精准,前一种刻画的正是我们这一类开发者
【 在 javaboy 的大作中提到: 】
: 其实绝大多数选用C++的人,追求的是zero-cost抽象:手上写的高等语法,脑子里盘算着这么写最后生成出来的机器语言会 ...
--
FROM 124.64.17.*
其实EXCEL就有了,#VALUE!
【 在 milksea (肥了,又肥了 >>>_<<<) 的大作中提到: 】
: 大概算不上纠偏,不过c++在继续提供做来越多的选项。
: c++23引入了expected类型以及一套Monadic工具,算是返回值方式处理错误的回归吧。这就是和类型,如果不往haskell之类函数式语言追溯,至少熟悉rust的话应该对Result不陌生。
: 【 在 z16166 的大作中提到: 】
: : 哪里在纠偏?给出链接或者原文
--
FROM 124.217.189.*
高可靠性的程序是不适合用异常的
异常主要用于业务逻辑,Python Java 那种,只需要在最外边 catch 一下记录下来然后退出。
【 在 pfan117 (pfan117) 的大作中提到: 】
: try catch,我觉得就是毫无意义的语法糖,跟编程语言的真正价值完全不搭边。
:
: 当初,某些做C++的人非要标新立异,非要弄得不一样。结果形式上改了,不用判断返回值了。结果,问题依然存在,依然需要处理,不仅如此,问题还变得更加复杂化了。
:
--
FROM 124.217.189.*
怎么能用Java/Python/JS的标准要求C++呢?那些语言编写的程序压根儿都不需要错误处理,挂了重启是标准操作。
【 在 z16166 (Netguy) 的大作中提到: 】
: 这不是个对错问题,而只是个flavor或者说paradigm问题。
: 根据自己的balance标准决定怎么搞。cpp大佬包括cpp他爹B.S,都是推荐用异常。
: 但要防止滥用异常,人多时这个并不一定好解决。
:
--
FROM 124.217.189.*
都用Java/Python/了还考虑性能吗……
C++连抛10个异常都比那俩不抛异常快10倍
【 在 iwantfly (雷雷) 的大作中提到: 】
: c++异常影响性能
: 那么java, c#,python之类的异常不影响性能吗
: c++编译器的开发商水平远低于以上语言的虚拟机?
:
--
FROM 124.217.189.*
好多语言都能造原子弹,也能造茶叶蛋
茶叶蛋崩了是无所谓的,C++写的桌面GUI大多数情况下崩了也无所谓
【 在 fanci 的大作中提到: 】
: 怎么能用Java/Python/JS的标准要求C++呢?那些语言编写的程序压根儿都不需要错误处理,挂了重启是标准操作。
--
FROM 222.130.138.*
你这就完全没有任何考察了
就算性能达不到90%, 80%还是有的
【 在 fanci 的大作中提到: 】
: 都用Java/Python/了还考虑性能吗……
: C++连抛10个异常都比那俩不抛异常快10倍
--
FROM 221.219.211.*
论挂了重启,除了c++还有谁能称王
任何一个语言都比c++在这点强
【 在 fanci 的大作中提到: 】
: 怎么能用Java/Python/JS的标准要求C++呢?那些语言编写的程序压根儿都不需要错误处理,挂了重启是标准操作。
--
FROM 221.219.211.*