`

前辈论C++缺点

    博客分类:
  • C++
阅读更多
从下一代标准讨论的新内容可以看出需要改进的地方。

先说异常,异常会损失一定的效率。过去的时候你不用异常也会损失一定效率,不过得益于编译器的进步,现在g++生成的代码如果不使用异常不会有额外的效率损失。

然后便是:C++不是全异常的,对于已有代码,引入异常不合适。对于新代码来说好一些,但并非所有人都愿意用。有人更习惯通过返回值来进行错误处理。(不过在C++中有时必须使用异常,比如构造)

粘贴google code style中关于异常的部分:
-----------------------------------
优点:
异常允许上层应用决定如何处理在底层嵌套函数中 “不可能出现的” 失败, 不像错误码记录那么含糊又易出错;
很多现代语言都使用异常. 引入异常使得 C++ 与 Python, Java 以及其它 C++ 相近的语言更加兼容.
许多第三方 C++ 库使用异常, 禁用异常将导致很难集成这些库.
异常是处理构造函数失败的唯一方法. 虽然可以通过工厂函数或 Init() 方法替代异常, 但他们分别需要堆分配或新的 “无效” 状态;
在测试框架中使用异常确实很方便.
缺点:
在现有函数中添加 throw 语句时, 你必须检查所有调用点. 所有调用点得至少有基本的异常安全保护, 否则永远捕获不到异常, 只好 “开心的” 接受程序终止的结果. 例如, 如果 f() 调用了 g(), g() 又调用了 h(), h 抛出的异常被 f 捕获, g 要当心了, 很可能会因疏忽而未被妥善清理.
更普遍的情况是, 如果使用异常, 光凭查看代码是很难评估程序的控制流: 函数返回点可能在你意料之外. 这回导致代码管理和调试困难. 你可以通过规定何时何地如何使用异常来降低开销, 但是让开发人员必须掌握并理解这些规定带来的代价更大.
异常安全要求同时采用 RAII 和不同编程实践. 要想轻松编写正确的异常安全代码, 需要大量的支撑机制配合. 另外, 要避免代码读者去理解整个调用结构图, 异常安全代码必须把写持久化状态的逻辑部分隔离到 “提交” 阶段. 它在带来好处的同时, 还有成本 (也许你不得不为了隔离 “提交” 而整出令人费解的代码). 允许使用异常会驱使我们不断为此付出代价, 即使我们觉得这很不划算.
启用异常使生成的二进制文件体积变大, 延长了编译时间 (或许影响不大), 还可能增加地址空间压力;
异常的实用性可能会怂恿开发人员在不恰当的时候抛出异常, 或者在不安全的地方从异常中恢复. 例如, 处理非法用户输入时就不应该抛出异常. 如果我们要完全列出这些约束, 这份风格指南会长出很多!
结论:我们不使用C++异常。
-----------------------------------------

然后是模板,模板问题很多。
首先,使用的模板的代码不支持分离式编译,结果便是一坨代码挤在一个头文件里。
然后就是编译错误,使用了模板的代码如果编译出错,那么产生的出错信息必然像天书一样,STL是个典型的例子。
然后就是由模板开始,C++被发掘出了一大堆技巧,而STL和Boost大量使用了这些技巧,这些技巧是十分难懂的。

上面说了模板不支持分离式编译,于是实现和定义挤在一个头文件中。在C中如果我们这么做,无语会在链接是出现定义冲突的情况。不过还好,C++编译器会搞定这个,代价就是 编译太慢。

C++的编译速度实在是太慢了,可不要小看这个问题,代码多了这就是个噩梦。

另外值得一提的是,为了解决分离式编译的问题,C++引入了export关键字,不过这个关键字几乎没有被编译器支持过(export本身也有问题)。

哪些十分诡异的库是什么库?编写操作系统会用到哪些库么?
-------------------------------------------------
十分诡异的库,首推Boost,STL的算法很好,但实现也有点蛋疼。写操作系统通常从头做起,不会使用任何的库。(库的很多功能依赖系统,比如C的malloc,printf,没系统没法用)。

C++支持函数重载,代价就是引入了函数签名。函数会根据参数的类型生成不同的签名。平时这不会有什么问题,不过如果要和汇编代码链接到一起就麻烦了,在dll中提供对外接口也是问题。所以,虽然Win是用C++和C写成的,API确是C风格的(还有一些原因导致这一点)。

struct对程序员几乎是完全透明的,通常编译器不会调整struct中程序在内存中布局的顺序(有个特例,gcc有个参数可以允许编译器进行这种调整)。但是C++编译器可能进行这种调整,于是不同的编译器生成的代码在二进制兼容方面就有问题了,这也是Win的API是C风格的一个原因。

还有就是有关面向对象的部分,和Java/C#比有很大不同,各有优缺点,不过有一点是肯定的,就是:C++复杂的多。
分享到:
评论

相关推荐

    排队论C++仿真

    "排队论C++仿真"是将经典的排队论理论与C++编程语言相结合,用于模拟和分析各种服务系统中的等待和处理过程。排队论是运筹学的一个分支,它研究了在随机到达和服务时间下的系统效率,如顾客等待时间、系统繁忙程度等...

    排队论C++语言仿真实现

    《排队论C++语言仿真实现》 排队论是研究随机服务系统中等待现象的一门学科,它在计算机科学、管理学、经济学等多个领域都有广泛的应用。离散事件系统仿真则是利用计算机模拟来分析和预测这些系统的行为,尤其是在...

    C++C++C++C++C++C++C++

    C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++

    c++小游戏 c++小游戏

    c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏...

    Effective Modern C++:改善C++11和C++14的42个具体做法(中文版 + 英文版)

    《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和...

    信息论香农编码c++程序

    信息论香农编码c++程序,还是比较简单的一个实验 ,售后服务QQ:857997674 有任何疑问或问题,请咨询QQ

    排队论MM1模型的C++仿真程序

    排队论MM1模型的C++仿真程序,程序中输入lambda,mu和total arrival之后就可以根据参数进行仿真并得出一系列的统计结果

    C++编程实例100篇

    《C++编程实例100篇》是一本深入浅出的C++编程教程,它以实践为主导,通过丰富的实例帮助学习者掌握C++语言的基础和核心概念。这本书的每个实例都精心设计,旨在帮助初学者和有经验的开发者巩固和提升C++编程技能。 ...

    21天学通C++(第五版) vs2008程序打包 深入浅出MFC 浙大教材C++达内 C++ 华为C++培训资料 visual c++_MFC

    21天学通C++(第五版) vs2008程序打包 深入浅出MFC 浙大教材C++达内 C++ 华为C++培训资料 visual c++_MFC 资源内容: visual c++_MFC 达内 C++ C++课件.ppt c++源码 .rar Core C++ Programming_new.ppt Core C++ ...

    实用C++的CHM集合

    《实用C++的CHM集合》是一份涵盖了C++编程领域的综合资源,包含了从基础知识到高级应用的广泛内容。这份集合共包含九个CHM( Compiled Help Manual)文件,是学习和查阅C++相关知识的理想工具。以下是这些CHM文件所...

    信息论 哈弗曼编码 c++程序

    信息论 哈弗曼编码 c++程序,采用字符跟踪法,而不是数据结构

    c++各种小游戏(我们老师的)

    【标题】:“C++各种小游戏(我们老师的)” 在C++编程领域,开发小游戏是一种非常有效的学习实践方式,尤其对于初学者来说。本资源集合包含了我们老师精心制作的一系列C++小游戏,旨在帮助学生深入理解和掌握C++...

    DevC++6.0 C/C++开发工具

    DevC++ 6.0 是一个轻量级的C/C++集成开发环境(IDE),尤其适合初学者入门学习这两种编程语言。它集成了编译器、调试器和其他必要的工具,为用户提供了便捷的代码编写、编译、调试一站式体验。 在C++编程中,DevC++...

    C++并发编程实践 C++ Concurrency in Action

    ### C++并发编程实践 #### 一、简介与并发编程基础 《C++并发编程实践》这本书由Anthony Williams编写,是一本深入讲解C++多线程编程技术的专业书籍。本书旨在帮助读者掌握C++中的并发编程技巧,并通过大量的示例...

    c++转C#工具

    标题中的"C++转C#工具"指的是一个软件应用程序,它能帮助程序员将源代码从C++语言转换为C#语言。这种工具通常用于在已经拥有大量C++代码库的情况下,想要利用C#语言的优势,或者将项目迁移到.NET框架的情况。 C++是...

    C++面试八股文深度总结

    C++是一种强大的编程语言,它在C语言的基础上引入了面向对象的特性,使得程序设计更加模块化和可扩展。C++具有以下显著特点: 1. 面向对象:C++支持封装、继承和多态这三大面向对象的特性。封装意味着数据和操作...

    C++_图书三人谈

    - 缺点:对初学者而言较为复杂,需要一定的C++基础。 3. **《Essential C++》** - 优点:简明扼要,适合作为入门教材。 - 缺点:有些读者可能会觉得内容略显浅显。 4. **《C++大学教程(第二版)》** - 优点:...

    《C++面试宝典2015版》

    4. 继承的优缺点 继承是一种面向对象的特点,它可以使子类继承父类的实现。但是,继承也有一些不足之处。因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现。此外,父类的任何改变都可能影响...

    C#调用C++DLL导出类

    在.NET环境中,C#代码通常与C++代码交互是通过平台调用(P/Invoke)或托管C++来实现的。然而,当涉及到C++动态链接库(DLL)中的类时,情况会变得稍微复杂一些。本文将详细介绍如何在C#中调用C++DLL中的类,以及如何...

Global site tag (gtag.js) - Google Analytics