c++的垃圾之处

gykgod 2013-11-04 05:28:31
1. 非0即为true 类型不安全

2. 语法特性木有coroutine 不支持并发

3. 栈大小固定,不利于递归

4. 常量的传染疾病

const char* fun1();//返回了个常量
void fun2()
{
const char* ret = fun1();
fun3(ret);
}
就这样传染下去 。

...全文
893 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
SKATE11 2013-11-05
  • 打赏
  • 举报
回复
没什么好说的
asdss 2013-11-05
  • 打赏
  • 举报
回复
1. 非0即为true 类型不安全 执行效率问题,自己看看asm级的比较语句 2. 语法特性木有coroutine 不支持并发 你当boost、openmp与cuda是吃屎的? 3. 栈大小固定,不利于递归 操作系统及cpu结构决定的,别忘了c++编译目标是本地语言,效率优先 4. 常量的传染疾病 const char* fun1();//返回了个常量 void fun2() { const char* ret = fun1(); fun3(ret); } 就这样传染下去 。 你当const_cast是吃屎的?
布鲁克斯南南 2013-11-05
  • 打赏
  • 举报
回复
什么语言好用就好,解决问题是王道
fishion 2013-11-05
  • 打赏
  • 举报
回复
C++确实很垃圾,大家都不要学,不要跟我抢工作
tbwork 2013-11-05
  • 打赏
  • 举报
回复
http://en.yinwang.org/blog-en/2013/04/08/cpp-const/ 这篇文章的意思是,尽量不要用const char * fun()作为函数的返回值。并不是说不好。 而且他的说法也不对。 如果你需要继承一个变量的const属性,那么一直加上也是情有可原的。 如果你只是想要这个指针指向的值,那么用 char leftv= *(fun()) 即可,不需要加const. 如果你只是想要这个指针的值(一个地址整数),那么用 char *a= (char*)(UNLONG)fun();强制转换即可,也不用加const,也就没有所谓的contagion。 老外不一定是权威。不要轻信。
秘游DCEL 2013-11-05
  • 打赏
  • 举报
回复
其实程序没有完美的吧。 C++是由历史发展而来,基于这多大的历史背景,一个不断改的程序,臃肿是很正常的。 java是新生的程序(相比C++)所以更加整洁,同时屏蔽了一些C++的麻烦和不需要的东西,但它管理内存就没有C++这么灵活了。 其实语言都各有优缺点!
jiandingzhe 2013-11-05
  • 打赏
  • 举报
回复
第四条: 在大型项目里,约束可以保证代码的正确性。
Exaybachay 2013-11-05
  • 打赏
  • 举报
回复
java 语言就这么死亡了.
lunat 2013-11-05
  • 打赏
  • 举报
回复
第一点的意思是要使用某个符号,则要求这个符号必须在“之前”声明过,比如 void func1() { func2(); } void func2() { ... } 前面的func2会出错,当然在C++的类里面已经有所改进,类中的代码可以随意使用成员变量/函数,而不用关心这些变量/函数在之前或者之后声明。这个是在讨论D语言的时候,讲的C++比较多的一个缺点。 还有: 1.C++继承C使用宏定义,容易引起混乱、错误,造成代码不清晰;而且因为大量预编译指令,导致代码分析工具无从入手,对代码分析工具来说C++代码就是个噩梦,除非把它做成C++编译器; 2.C++的枚举成员的作用域扩散问题,比如声明: enum C { a = 1, b = 2 }; 则在C的作用域范围内都可以直接使用a,b;
引用 12 楼 stereoMatching 的回复:
[quote=引用 9 楼 lunat 的回复:] 第一点是C的问题,C++已经有内置的bool类型,如果你对数字做逻辑判断,实际上执行的是类型转换; 第二点并行计算支持,这个确实是C++的缺点,C++11从标准库上添加了一些支持; 第三点栈大小不可变,这个不应当算是C++的缺点,这个应该说比较偏门的应用。在栈不够的特殊情况下,其实也可以通过创建线程时指定栈大小方式应对; 第四点,C++是强类型检查,而且有const_cast存在。 感觉楼主没说在点子上: 1.强制符号前向声明(不能使用在调用者后面声明的符号,同一个类中的代码除外); 2.使用头文件,而不是符号表的方式导入符号,导致编译速度慢; 3.模板规则过于复杂,很难精通; 4.没有内置的数组类型,传递数组时,数组长度信息丢失; 5.字符串处理通过标准库而不是由语言本身支持; 6.缺少语言内置的堆内存回收机制(有争议); 7.缺少内置的并行计算支持;
1 没看懂 2 没意见 3 大部分人都不需精通,能了解c++ primer 5第16章的内容即可 还是那句老话,c++很复杂很庞大,但是我们只需要学习其精华就能 写出好的代码,其他有的没的例外,没事就别去碰了 4 有std::array可以代替,也可以根据情况选择其他容器 若要求array必须自带长度 5 由语言本身支持不知道有没有办法在不影响执行效率的前提下做到, 做不到的话c++不可能支持,因为c++有个原则--执行效率不能比c低 6 我觉得RAII比gc类语言还要容易使用,RAII可以guard的资源可不只是 memory,几乎你想到的resource都可以。c++的大佬们呼吁大家善用RAII 已经喊了很多年。这是一个简单却威力无穷的技术,可惜落后的中国还是不盛行 7 这点没看懂,不是有std::async, std::thread, std::package_task? std::atomic?c++17或许会加入openMP或其他parallel algorithms的支持 并行的方案背后有三家大公司--microsoft,intel,nvidia在推动,希望能如期推出[/quote]
nalisaki 2013-11-05
  • 打赏
  • 举报
回复
只要知道这些就行了,栈大小是可以设置的,与系统有关,c++11里已经内置并发支持。其他的两个需要用时注意。
stereoMatching 2013-11-05
  • 打赏
  • 举报
回复
c++缺点很多,就是太复杂,太复杂,太复杂,真是垃圾 c严重缺乏抽象机制,根本是垃圾中的战斗机 java强迫程序员必须全部用class表达,不能让我们自己 管理memory,真是垃圾中的垃圾 c#不.....以下请大家继续 到底有那一门语言完美到可以让人挑不出毛病的?
stereoMatching 2013-11-05
  • 打赏
  • 举报
回复
引用 9 楼 lunat 的回复:
第一点是C的问题,C++已经有内置的bool类型,如果你对数字做逻辑判断,实际上执行的是类型转换; 第二点并行计算支持,这个确实是C++的缺点,C++11从标准库上添加了一些支持; 第三点栈大小不可变,这个不应当算是C++的缺点,这个应该说比较偏门的应用。在栈不够的特殊情况下,其实也可以通过创建线程时指定栈大小方式应对; 第四点,C++是强类型检查,而且有const_cast存在。 感觉楼主没说在点子上: 1.强制符号前向声明(不能使用在调用者后面声明的符号,同一个类中的代码除外); 2.使用头文件,而不是符号表的方式导入符号,导致编译速度慢; 3.模板规则过于复杂,很难精通; 4.没有内置的数组类型,传递数组时,数组长度信息丢失; 5.字符串处理通过标准库而不是由语言本身支持; 6.缺少语言内置的堆内存回收机制(有争议); 7.缺少内置的并行计算支持;
1 没看懂 2 没意见 3 大部分人都不需精通,能了解c++ primer 5第16章的内容即可 还是那句老话,c++很复杂很庞大,但是我们只需要学习其精华就能 写出好的代码,其他有的没的例外,没事就别去碰了 4 有std::array可以代替,也可以根据情况选择其他容器 若要求array必须自带长度 5 由语言本身支持不知道有没有办法在不影响执行效率的前提下做到, 做不到的话c++不可能支持,因为c++有个原则--执行效率不能比c低 6 我觉得RAII比gc类语言还要容易使用,RAII可以guard的资源可不只是 memory,几乎你想到的resource都可以。c++的大佬们呼吁大家善用RAII 已经喊了很多年。这是一个简单却威力无穷的技术,可惜落后的中国还是不盛行 7 这点没看懂,不是有std::async, std::thread, std::package_task? std::atomic?c++17或许会加入openMP或其他parallel algorithms的支持 并行的方案背后有三家大公司--microsoft,intel,nvidia在推动,希望能如期推出
GongKiro 2013-11-05
  • 打赏
  • 举报
回复
反应的很大,借用我一前辈的话,只要是人写出来的程序都是垃圾!
赵4老师 2013-11-05
  • 打赏
  • 举报
回复
金无足赤,人无完人。 什么东西没有垃圾之处?!
abs618 2013-11-05
  • 打赏
  • 举报
回复
每个人有自己的见解,我尊重你的想法,不过我觉得没有什么啊,C++毕竟是初级语言,还有编程本身就是门艺术,有错误不可怕,关键是享受怎么用更简单的方法运行出想要的结果,你说是不是?与其抱怨,不如自己动手,你要是能改掉这些缺点,你也就圆满了。
木易木木木 2013-11-05
  • 打赏
  • 举报
回复
无论是cpp或c再或者其他语言都是建立在规则之上的这些规则建立自硬件架构之上 懂得运用规则的就已经在同层次上很有见底了。想看到并懂得架构本身你就是专家了,能运用设计构架那你就是神了。无所谓有缺看你想干什么?
qq120848369 2013-11-05
  • 打赏
  • 举报
回复
coroutine与并发没有什么关系,你理解太浅。
allenltiverson 2013-11-04
  • 打赏
  • 举报
回复
按你说的只有你开发出的编程语言才不垃圾
水平不流 2013-11-04
  • 打赏
  • 举报
回复
我不学C++,一直用C。 但是楼主应该区极客头条看看那篇,信仰毁了程序员这篇文章。讲得很好
lunat 2013-11-04
  • 打赏
  • 举报
回复
第一点是C的问题,C++已经有内置的bool类型,如果你对数字做逻辑判断,实际上执行的是类型转换; 第二点并行计算支持,这个确实是C++的缺点,C++11从标准库上添加了一些支持; 第三点栈大小不可变,这个不应当算是C++的缺点,这个应该说比较偏门的应用。在栈不够的特殊情况下,其实也可以通过创建线程时指定栈大小方式应对; 第四点,C++是强类型检查,而且有const_cast存在。 感觉楼主没说在点子上: 1.强制符号前向声明(不能使用在调用者后面声明的符号,同一个类中的代码除外); 2.使用头文件,而不是符号表的方式导入符号,导致编译速度慢; 3.模板规则过于复杂,很难精通; 4.没有内置的数组类型,传递数组时,数组长度信息丢失; 5.字符串处理通过标准库而不是由语言本身支持; 6.缺少语言内置的堆内存回收机制(有争议); 7.缺少内置的并行计算支持;
加载更多回复(8)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧