精华内容
下载资源
问答
  • 前辈论C++缺点

    2012-05-15 13:33:48
    从下一代标准讨论的新内容可以看出需要改进的地方。  先说异常,异常会损失一定的效率。过去的时候你不用异常也会损失一定效率,不过得益于编译器的进步,现在g++生成的...(不过在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++缺点

    千次阅读 2008-04-22 16:12:00
    C++ 现在最时髦的用法是 template meta programming。booster 们对此非常津津乐道,我本人也是个狂热的booster。到了什么程度?不使用template 就浑身不舒服,不boost一下就感觉对不起C++。但是这种狂热带来的严重...

    C++ 现在最时髦的用法是 template meta programming。booster 们对此非常津津乐道,我本人也是个狂热的booster。到了什么程度?不使用template 就浑身不舒服,不boost一下就感觉对不起C++。但是这种狂热带来的严重后果就是程序编译速度极慢无比,生成的执行程序尺寸超常。

    曾经一个 C++ 服务器程序,代码也就10000行左右,编译出来的执行程序竟然20M!编译时间半小时!写的时候感觉不到用了多少template,但是写出来竟然得到这样的结果,不得不让人吃惊!

    记得在大学的时候(2000年前后),初学习 template 时,感觉template之间的耦合有点“过于松散”,就像只要有一个螺母,再一个螺栓,就可以往一起套,而不管他们是否一个是塑料,一个是金属,大小粗细是否匹配,螺距是否匹配,所有的这一切,如果只有哪怕一点点不匹配,都会在编译错误中造成一个非常令人费解的超长消息。当初也不知道这一点早已被无数人诟病了,就写了一片文章,自作聪明地提出应该对模板参数有个类似接口声明一样的规格定义(现在C++0x 中的对应物是concept)。当初立即招致骂声一片。现在这一点已经毋庸置疑了,C++0x出世后我们就可以结束这些痛苦了。

    但是,前面说的C++的那两个致命缺点,看来短期内很难克服。

    编译时间,受制于文件包含这种古老的内存不够用的时代的无奈选择,就像人的阑尾,喉头,视网膜。

    程序尺寸,这个缺陷在某些时候也非常致命,举个简单例子,std::sort 使用了多种排序策略,每个sort 的机器码都很大。同时,对每一种数据类型,每一种randiter每一种comparator,都会生成一个sort 的版本,这会造成非常大的代码膨胀。相比之下,C 的 qsort 就没有这种缺陷。如果我们对几十种数据,使用几十个comparator排序,std::sort 的代码尺寸比 qsort 要大几十倍。虽然它在inline方面获得了优势,但是cpucache的失效,甚至是memcache的失效,造成的性能损失要大得多。BS在TCPL中提到的消除代码膨胀的方法,在某些情况下的确有用,但是太繁琐,大约也只有库编写者会使用它。

    Java现在也支持泛型,据说不存在代码膨胀问题,但它的泛型只是语法糖,对程序性能好像没有提升。

    C++ 怎样平衡代码膨胀和代码性能?是否可以为 template 生成 runtime meta info,用来操纵泛型算法。或甚至使用这些meta info 来在运行时生成真正的机器码。这样甚至可以允许在运行时进行template组装,而不是完全在编译时?这又有些类似于现代虚拟机(如Java HotSpot 虚拟机)的动态优化。

    扯太远了,休息下。

    展开全文
  • c++缺点

    2009-08-21 10:38:57
    事实上Java的面向对象模型要比C++要好,C++是一个追求效率而不惜牺牲其他空间和优美方面的语言。 一、C++没有interface的概念,这是面向对象概念的很大的一个缺失,当然纯抽象类就是interface,但至少是概念上的一...
    从编程的未来这篇文章http://utensil.iteye.com/blog/367415 想到C++和Java语言的爽与不爽:

    事实上Java的面向对象模型要比C++要好,C++是一个追求效率而不惜牺牲其他空间和优美方面的语言。
    一、C++没有interface的概念,这是面向对象概念的很大的一个缺失,当然纯抽象类就是interface,但至少是概念上的一种缺失。因为interface和抽象类在面向对象中是完全不同的概念,设计的目的也不同,抽象类是为了别人继承,而接口一种契约和规范。
    二、C++的继承体系不够完善。C++在每个对象中安插一个指向虚函数表的指针来完成多态,实则是以空间换时间的做法。而Java有着完善的继承体系的实现,查找方法通过super指针遍历类体系结构,这是大多数语言采用的方法。C++这种做法导致类继承函数隐藏的诡异行为(子类一个不同方法签名相同方法名的方法会隐藏掉继承下来父类的方法),实在不爽。
    另一方面C++缺少单根继承(Java的所以类的根都是Object),这其实也是面向对象概念的一个缺失,一切都是对象。这样一些类就没有了一个统一的约束。
    三、C++引用这个东西的名字几乎起错了,实际应该叫别名,而不是到处都在说引用就是别名这个东东。引用这个词与大多数语言语义都不同。
    四、C++显式对象存在(Java中的对象都不是显式的,是由引用持有的,你看到的都是引用)只会导致误用,由此导致对象的无味拷贝。从而引出像拷贝构造函数,以及引用传递的复杂概念来支持和避免带来的问题。这当然是C++不得不做的,因为class的概念根深与struct,指针的作用指出也必须是这些显式存在才会发挥作用。
    五、C++拷贝构造函数,对指针成员深拷贝无能为力,需要手写虚clone方法实现prototype模式,并且没有同一个一个约束,如果原来没实现,使用它作为成员指针的类深拷贝是无能为力,这样是缺少单根继承所造成的后果。而这一切Java都是内置的。
    六、C++的异常很不成体系,使用起来让人觉的很是不爽。
    七、C++缺少反射机制,这点对使他真正的成为“静态语言”,许多更优雅的框架设计从此离他远去。
    其他方面:
    八、C++的多维数组作为传递一直很无奈,而Java则足够智能。
    九、C++的返回函数内的对象一直没有很好的解决方法。局部对象直接返回造成无意义的拷贝,返回地址则因失去作用范围而无效,使用new在堆中申请需要让别人去delete,而这使用者可能一无所知。使用智能指针,让人阅读代码痛苦不堪,我曾读过Firefox源代码全是智能指针,导致Eclipse ctrl快捷键阅读代码完全失效。这就是托管语言,垃圾回收爽的地方,从而带来代码上的优雅。
    九、C++的string和char *不能自动相互转化这点非常不爽。
    十、C++的stl库设计缺少和向数组这样基本结构转换的接口。以及一些容器设计不够优雅,
    如map的count,find这个函数名字叫的莫名其妙。
    十一、其实大量的程序员不会使用C++的const,由此造成传递参数的时候,如果没有参数没有const修饰,而无法传递常量的困苦。以及其他赋值方面没有一个约束机制,例如char *s = "abcd";很自然的一个语法却潜藏阴险的问题。
    当然Java也有一些ugly的语法,例如不支持默认参数,泛型是一种擦拭机制。但基本上Java是在去除C++语法的复杂性和糟粕的东西,而吸取了其精华的部分,让你远离了危险的代码而保持健壮性。



    写道
    C++是设计模式最好的描述语言,我看到许多书用Java这种先天不足的语言来描述设计模式,就觉得别扭



    我倒和你有相反的想法,C++描述设计模式要考虑的C++语言的语法的太多,而Java则简单明了的表明了意图。


    写道
    Java使OO的一切都变得不再美妙,使一切变得麻烦,这就是我们为所谓的简化付出的代价。



    我不知道有哪些不美妙的地方。至少我感觉Java的OO机制要比C++美妙的多,C++在向下兼容c的面向过程和一切以效率为目标,以及在stl试图得到使用函数式语言的美妙感觉而背弃面向对象的方法,让它变得不伦不类。

    写道
    静态语言不能丢失指针,不能丢失引用

    Java的引用就是安全的指针,在面向对象语言中,指针的++,--操作不仅危险而且显得很别扭,C++引用其实是一种在提供一种防止大对象拷贝的方法,而Java完全不会有大对象拷贝的情况,而引用的副作用可怕的很。在引用传递的时候,形参的突然改成别的对象的别名,
    实参的引用仍然很无辜的以为还在是原来那个对象的别名,虽然可以加上const T &t来限制这个东西。C++给程序员的责任太多,我每次写C++代码的时候都要小心翼翼,不是在考虑设计而是在考虑细微的语法所带来的别人如何使用问题。
    展开全文
  • C语言与C++缺点

    2020-03-27 18:51:49
    C语言的缺点: 1、扩展性差2、复用性差3、维护性差 面向对象:C++的优点: 1、扩展性好2、复用性好3、维护性好 C语言+面向对象方法论:1、objectivec2、c++ C++支持的编程规范:过程式、数据抽象、基于对象、面向...

    C语言的优点

    1、出色的移植行2、访问硬件3、运行效率高
    注:所有的操作系统的内核都是用C语言实现的

    C语言的缺点:

    1、扩展性差2、复用性差3、维护性差

    C++的优点:

    1、扩展性好2、复用性好3、维护性好

    C语言+面向对象方法论

    1、objectivec2、c++

    C++支持的编程规范

    过程式、数据抽象、基于对象、面向对象式、函数式、泛型形式、模板元形式、值语义与对象语义
    值语义可以拷贝与赋值,对象语义不可以进行拷贝和赋值

    声明定义

    C++中强调语言的“实用性”,所有的变量都可以在需要的使用时再定义;
    C语言中的都必须再作用域开始的位置定义;

    Register

    被register修饰的变量叫做寄存器变量
    使用寄存器变量的注意点:
    待声明的寄存器变量类型是CPU寄存器所能接受的类型,意味着寄存器变量是单个变量,变量长度应该小于寄存器长度。
    不能对寄存器变量使用取地址符&,因为该变量是没有内存地址的;
    尽量在大量频繁操作的时候使用寄存器变量,并且声明的寄存器变量个数尽可能的少。
    Register关键字请求“编译器”将局部变量存储于寄存器中
    C语言中是无法取得register变量的地址;
    C++依然支持register关键字
    C++编译器有自己的优化方式,不使用register也可能做优化;
    C++中可以取得register变量的地址;
    C++编辑器发现程序中需要取register变量的地址时,register对变量的声明变得无效;
    Const

    C++编辑器对const常量的处理

    当碰见常量声明时在符号表中放入常量;
    编译过程中若发现使用常量则直接以符号表中的值替换;
    编译过程中若发现对const使用了extern或者&操作符时,则给对应的常量分配存储空间
    注意:C++编译器虽然可能为const常量分配空间,但是不会使用其存储空间中的值;
    动态内存分配
    C++中的动态内存分配
    C++中通过new关键字来进行动态内存申请
    C++中的动态内存申请是基于类型进行的
    Delete关键字是用于内存释放的
    变量申请:数组申请:

    Type*pointer=newType;
    Type*pointer=newType[N];
    

    Deletepointer;delete[]pointer;
    New关键字与malloc函数的区别
    New关键字是C++的一部分;malloc是由C库提供的函数
    New以具体类型为单位进行内存分配,malloc只能以字节为单位进行内存分配
    New在申请单个类型变量时可进行初始化,malloc不具备内存初始化功能
    引用是给一个变量起别名
    定义引用的一般格式
    类型&引用名=变量名;
    例如:inta=1;
    int&b=a;//b是a的别名,因此a和b是同一单元;
    注:定义引用时一定要初始化,指明该引用变量是谁的别名;
    函数传参:按引用传递
    引用传递方式是在函数定义时在形参前面加上引用取地址符&;
    例如:voidswap(int&a,int&b);
    按值传递方式容易理解,但形参值的改变不能改变实参的值
    地址传递的方式通过形参的改变使相应的实参改变,但程序容易产生错误,而且难以阅读;
    引用作为参数对形参的任何操作都可以改变实参的相应数据,又使函数调用显得方便,自然。

    引用作为返回值

    引用的另一个作用就是用于返回引用的函数;
    函数返回引用的一个主要目的就是可以将函数放在赋值运算符左边;
    注:不能返回对局部变量的引用
    引用访问一个变量是直接访问,指针访问一个变量是间接访问;
    引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间;
    引用一经初始化,就不能再引用其他变量,而指针可以
    注:尽可能的使用引用,不得已时使用指针。

    ## 内联函数
    Inlineintmax(inta,intb)
    {
    Returna>b?a:b;
    }
    #definemax(a,b)(a)>(b)?(a):(b)
    

    内联函数调用时,要求实参和形参的类型一致,另外内联函数会对实参的表达式进行求值,然后传递给形参;而宏替换只是用实参简单的进行替换形参;
    内联函数是在函数编译的时候,在调用的地方将代码展开,而宏则是在预处理时进行替换;
    在C++中建议使用内联函数来替换带参数的宏

    函数重载的条件

    函数重载的不同形式:
    形参数量不同
    形参类型不同
    形参顺序不同
    形参数量和形参类型的不同
    调用重载函数时,编译器通过检查实际参数的个数、类型和顺序来确定相应的被调用函数

    extern“C”实现C和C++混合编程

    #ifdef_cplusplus
    extern“c”
    {
    #endif
    …………
    #ifdef_cplusplus
    }
    #endif
    
    展开全文
  • C++缺点之我见

    万次阅读 2017-09-19 09:28:07
    现在的趋势是多语言混成编程,故本文是针对混合编程。...3,C++根本缺点: 难学。新手被指针搞死,中手(约3年工作经验)被stl标准库和模板搞死,高手(约5年工作经验)被boost搞死。由于stl难懂,大
  • C++、Python 优缺点

    2020-04-16 22:42:27
    C++ 与 Python C++ 优点 1. 是所有语言运行速度最快的 2. 可移植 3. 面向对象机制 4. 功能强大 缺点 1.相对于其它语言,学起来相对困难 2.知识点繁杂 Python 优点 1. 简单、易学 2. 免费、开源 3. 可...
  • 个人分享JAVA与C++优点缺点对比

    千次阅读 2013-05-13 10:31:12
    个人分享JAVA与C++优点缺点对比,喜欢的人进来看看--- java的优点在于: 1.Java比C++简单,学起来比C++容易。 2.Java完全对象化,比如数组在Java中是一个对象,含有length这个属性;而不像C++中数组是一个指针...
  • 大多数程序员都认为C/C++会比Java语言快,甚至于觉得从Java语言诞生以来,“执行速度缓慢”的帽子就应当被扣在头顶,这种观点的出现是由于Java刚出现的时候JIT编译技术还不成熟,主要靠解释器执行的Java语言确实性能...
  • c++ 模板的优点和缺点

    2019-09-29 08:45:24
    Templates in C++ - Pros and Cons By SergeyChepurin | 29 Oct 2011 C++WindowsIntermediate Advantages and drawbacks of usingtemplates in C++ projects LicenceCPOL First Posted29Oct 2011...
  • c++与java的优缺点

    千次阅读 2014-07-26 15:33:17
    大多数程序员都认为C/C++会比Java语言快,甚至于觉得从Java语言诞生以来,“执行速度缓慢”的帽子就应当被扣在头顶,这种观点的出现是由于Java刚出现的时候JIT编译技术还不成熟,主要靠解释器执行的Java语言确实性能...
  • C++虚函数的缺点

    万次阅读 2016-10-11 16:00:15
    虚函数有什么缺点或者析构函数声明为虚函数有什么缺点?大体原因如下:如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,使析构函数为虚一般是个坏主意。因为它会为类...
  • 但在决定使用C++模板之前,让我们分析一下使用模板的优缺点。 目的: 当被问及引入C++模板的目的时,C++的发明者Bjarne Stroustrup告诉我“这是为了支持类型安全、类容器的有效性和算法的通用性”。 优势和劣势: ...
  • STL容器介绍及选择方式容器类型容器优缺点一 序列容器vectordequelistforward_list(C++11)queuepriority_queuestackarray二 关联容器setmultisetmapmultimap三 无序关联容器 容器类型 以前的11个容易分别是deque、...
  • C++中宏定义的优缺点

    2018-07-30 10:42:22
    它是由C++统一规定的,但非C++语言本身的组成部分,由于编译器无法识别他们,不能对其直接进行编译。预处理过程必须在对程序进行词法与语义分析、代码生成与优化等通常的编译过程之前进行,经过预处理后的程序不再...
  • C++ 多重继承的优缺点

    千次阅读 2018-09-20 21:12:56
    举例:现实生活中,许多事物可能有两个或者两个以上事物的属性,为了描述这种情况,C++引入了多继承。 允许一个类指向多个基类,这样继承的结构叫多重继承。   概念 多重继承:常规情况,一个类只有一个基类,...
  • C/C++的优点和缺点

    万次阅读 2018-08-18 16:15:00
    1.C/C++语言的优点   C语言是面向过程的语言,常用来编写操作系统。C++语言是从C语言发展过来的,是一门面向对象的语言,它继承了C语言的优势,同时也添加了三个主要的内容:Oriented-Object class,Template,STL....
  • 众所周知C/C++、Java、Python都是主流的后端开发语言,并且不同的语言,具备不同的优缺点以及就业方向。解析来小编带你一起看看C/C++的优缺点以及就业方向: 深入解析C/C++的优缺点以及就业方向 C语言是很多语言的...
  • mutithread主要特点: ...缺点: 代码容易出错,mutithread类似于goto 可以能的问题包括: 1、死锁 (两个线程相互等待对方释放资源) 2、乱序 3、并发访问数据造成的问题(问题查错困难)...
  • C++缺点之一,是相对许多语言复杂,而且难学难精。许多人说学习C语言只需一本K&R《C程序设计语言》即可,但C++书籍却是多不胜数。学习C++大概可分为4个层次: 第一层次,C++基础:挑选一本入门书籍,如...
  • C++ 友元的优缺点

    千次阅读 2011-09-26 13:17:03
    1. 友元是C++提供的一种破坏数据封装和数据隐藏的机制。 2. 通过将A模块声明为B模块的友元,A模块能够引用B模块中本来被隐藏的信息。 3. 为了确保数据的完整性及数据封装与隐藏的原则,建议尽量不使用或少使用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,484
精华内容 2,993
关键字:

c++缺点

c++ 订阅