C++中的STL标准库到底该不该用?

clonne 发布于 2012/06/21 23:30
阅读 83K+
收藏 21

我正在做一个软件,因为是C++开发,所以我当时就决定了使用STL标准库,到目前为止,所有的字符串、链表等全部都是用的STL。

但是我最近越来越感到不舒服,STL好像并没有我认为的好用。首先,我感觉到STL似乎有过度设计的现象,分来分去,弄得分出了分配器、迭代器一大堆概念。这让我感觉不安,项目慢慢的成长中,STL很可能会为我的项目带来副作用,虽然STL减少了大量的代码,但是我认为这种方式的减少是不良的。对,我想说的就是,STL好像是为了抽象而抽象,过度的设计导致了大量无关的概念,庞大又臃肿、晦涩难用。虽然如此,但是我还是不能确定是该及时取消STL还是继续坚持STL,我的项目刚做完核心,还没有建立起来,我不想就这么毁了。

我不知道现在到底该如何做,是及时取消STL还是坚持,从确定有STL到现在有了一段时间了,已经有大量的代码使用了STL(还包括我为该项目的文件存储而创建的另一个库项目),如果取消那么将耗费时间在修改上,而且代码充斥着大量依靠STL的细节,所以我现在感到不安。

大家能否给个建议?

加载中
2
天远
天远
如果是大项目,选择STL是一个很明智的选择,一个大项目,STL的庞大被弱化了,但是效率的提高确是绝对的,有STL的开源实现代码,如果实力够强,大可以精简STL,STL本身,C++本身就是为大项目而设计的嘛
2
中山野鬼
中山野鬼

哈。我也来凑个热闹。

首先,C++搞的不熟,不好说C++的STL好坏。(STL在C++中的好坏)

其次,如果换C,STL能做的事情,C里面一样可以很快做出来。

再次,STL和C的#define很像,经常被人喷,也经常被对应对高手熟练使用。

最后,如果涉及到底层或系统级的代码,最好不要用STL,虽然对C++不熟练,但至少知道STL生成的东西(优点所在),不是你可控的东西(也就是缺点)。

优点就是缺点,这个是经常发生的,哈。不是自身的错,而是环境或期望不同导致的。篮球运动员,中锋一般高大无比,让他去举重,我相信没人说这个身高是优势。

另外扯淡一句找喷的话题,C++的业务面真的很窄。程序无非是面向业务优先,还是面向设备优先。也即,为动态的业务服务,还是为优化硬件,OS,底层库服务。前者通常是真实世界的人性思维的角度看问题,后者 需要很务实的面向设备实现的角度看问题。所以前者用面向对象的多,但后者用面向对象的少。C++这个倒霉蛋就在于,现在属于两头都能靠上,两头都靠起来很不靠谱。

不做底层的朋友,不妨想想,现在有几个APP是用C++开发的?

做底层的朋友,也不妨想想,用C++的实现中,有多少代码是非C语言的面向对象逻辑的描述。同时这种描述的必要性在哪?

风从东方来
风从东方来
回复 @__november_rain__ : 用C的方式写C++,说明很多情况用不上C++的特性,C足够了
__november_rain__
__november_rain__
我对C++也不太熟,但是的确存在这个现象:很多人在以C的方式写着C++的程序。
幻の上帝
幻の上帝
底层或系统级的代码,最好不要用STL?会撸系统的就有本事自己发明好轮子了?照BeOS那套胡搞的玩意儿?
王子亭
王子亭
回复 @Windoze : 因为STL在编译时会生成相当大量模版代码, 有时候会有些非常诡异的问题,一般人很难真正预料到会产生怎样的模版代码。有些C项目也使用的是C++编译器或者标注为C++, 但也许他们只是用到了C++中很少很少的功能(例如const).
nekocode
nekocode
回复 @Windoze : 比起宏哥,中山野鬼算是比较客观的了,虽然我也不赞同野鬼找喷的那一段,哈~
下一页
2
青萍之末
青萍之末

引用来自“宏哥”的答案

引用来自“Lunar_Lin”的答案

引用来自“宏哥”的答案

引用来自“Lunar_Lin”的答案

为什么选择C++?
1.  大公司的影响.  电信公司/google/微软/应用软件厂商(adobe). 的确如果没有google, C++在被微软抛弃后, 流行性可能更要大跌.
2.  应用领域. 绝大多数的桌面软件, 游戏服务器, PC游戏客户端, 一部分服务器应用开发, 一部分嵌入式软件. 你不用C++, 你和该领域就遥远.
3. 高效的本地语言, 如果你想带上语言的高级特性, 你只有C++可选.
4. 泛型编程. 如果你对此感兴趣, (当然这也是很多人疏远C++的原因), C++是你最正统的选择.
     STL有一些需要注意的操心点.但没有语言是可以不操心的,有什么语言你可一上来就胡写乱写不考虑细节吗? 没有. 如果是java, 那么这也是它产生了这世界上最多垃圾程序代码的原因.
如果你讨厌无数时间用来敲一大堆字符, 厌恶写Compare.compare(s1,s2); 想写  if( s1==s2)  那么就使用C++吧 !(不过请先注意领域, 人必须要先活着再谈兴趣)

1. 大公司都严格限制可以使用的库. 可以很认真的告诉你, STL,Boost这种质量的库,大多时候都是被禁止使用的. 他们允许使用C++都在严格的限制下使用.

2. 桌面软件,游戏软件 C++主要就是做UI. 而UI部分,用C++开发的很少. 嵌入式,大多连C++的编译器都不支持. 除非是终端部分. 游戏逻辑,都有嵌入式语言支持.

3. 所有原语发布,都是C. 包括不限于 winapi, posix, directx, directsound,Com

4. 泛型如果用c来表达,就是增加一个参数,进行分支处理.C++把它搞复杂了. 用宏的话,比C++更简洁.

综上所述, C++基本上是在价值链的低端生存,而且非常低效. 至于用到STL,Boost的软件, 顶多也就是一些桌面软件的UI部分, 大多都是价值非常低的软件,而且质量非常糟糕.当然有些软件部署广泛,也有比较大的价值. 

不相信,可以自我衡量一下,是不是处在这样的价值链上. 

为什么C++这样复杂的语言, 相应的程序员收入却不好,做得却是最辛苦. 是有内生的原因.这个原因就是因为C++扼杀了他们的生产力.

 反观C, 更简洁, 待遇却好得多.

甚至这种语言制造了像  bastetwang 这样的怪物,被C++强X之后,产生的斯德哥尔摩综合症,C++一天不FK他,他就不舒服.太神奇了.

引用野鬼的话,我能理解这种怪物. C++的工作,辛苦又不来钱,还有人鄙视.

0. 除了做应用软件的较低, C++工资较高, 你不必担心. 可以查语言工资排行. 至于C, 我只说想说你想找份只用C的工作不容易. 就像基金公司一样. 有些娱乐圈的明星很来钱, 但大多数走穴唱歌的人都是苦逼.
1. 我能说出一堆使用STL的公司,  基本大家知道名字的公司都可以使用STL.(不熟悉STL,无法通过面试.)所有的电信公司, 所有的游戏公司, 腾讯, google,微软, 等等等. 我希望你列出哪家公司有条文: " 大家用STL时候注意了. 不准什么什么. "
2. 桌面软件C++不仅仅垄断了GUI 而且逻辑也几乎都是C++. 应用软件纯C++的,放眼过去几乎都是.你大可以说出一个个桌面软件,然后看看其开发语言. 游戏业务逻辑在服务端使用脚本有其特殊原因.但没人会拿lua实现服务器网络处理. 嵌入式 有高端和低端区别, 有的终端连个C标准库都放不进去.来10个c文件就报代码段溢出,  =.=|| 还谈什么C++, 但嵌入式不只是匮乏资源的平台, 也有平台资源相当丰富的大型设备的嵌入式. C++在其中负责逻辑.
3. 系统原语完全是C的份, 因为只需要支持到这一层.这完全和C++无关. 难道其它高级语言可以参与? C在这方面已经是垄断地位, 有不服C语言ABI的本地语言吗? no. 小样, 系统api还想不想调用了? 这是垄断地位,而不是因为优秀.
4. 模板拥有宏的好处, 但宏没有模板的强大功能. C中无数的宏说明 自动产生代码这种功能是有需求的. 泛型不只是泛型容器, 所以不是加参数那么简单. 如果说面向对象的继承做到拥有同样的接口就可以替换(动态多态), 那么模板就是更强的效果, 不必你真的有这个函数签名, 只需要你的写法能这样写,你就能替换(静态多态).很宏,但比宏强的多.

就提几点:

1. c: 工作机会,更多在非聚光灯下的. 这里我也不多说了.可能这里大多看到一些桌面软件和互联网公司. c的产业空间, 桌面,互联网是非常小的一块. 如果非要举例,我就说HW.

2: 关于大公司的规定. 核心产品,对库都有严格限制,如果要举例,我还以HW为例. 还有一些工业公司,比如nuclear,电力控制软件,.... MS在自己的整个产品线,都不用STL,MFC. 如果没有严格规定,达不到这样的质量控制. 至于更底层的,不说你也知道,基本上完全是C.只是因为产业链的原因,大多人接触得少.

3. 关于桌面. C++份额很小.至于待遇, 从HH拿到的资料,C++相比其他, 待遇属于偏低的,以及工业等 横向和纵向比较. 相比较C++这种复杂性,可以认为,C++对待遇有负面影响. 直白得说,就普遍状况,学习以及使用C++,对待遇的影响,基本上是负面的.互联网有些公司待遇可能不错,更多是盈利能力的问题. 这里仅做普遍比较.

4. 模板比宏更高级. 但是,通常,增加一个参数,连宏都不需要. 总之,C可以有更简洁的表达,仅此而已.

我在你所说的大公司。。带一个项目,做大型游戏,说几句
=============
boost是不用,因为太笨重,把代码搞得恶心
stl是肯定用的,久经考验,其带来的好处已经超过了坏处
另外,就我所知,做大型游戏,c++基本是必须的,c的表达力,写起逻辑来很费事,lua这些脚本是会用,但逻辑全靠它就扯淡了
=============
c++缺点太多了。。但是,还是很强大的,关键在于代码组织与控制
==============
我也有11年编码经验。。别扯什么破事,觉得不好用就别用,不必一杆子打倒一船人
另外,我也同意c++标准委员会是一群sb学究,就这样

===============
你说的以下两点纯扯淡,至少在我这个公司
===============
1. 大公司都严格限制可以使用的库. 可以很认真的告诉你, STL,Boost这种质量的库,大多时候都是被禁止使用的. 他们允许使用C++都在严格的限制下使用.

2. 桌面软件,游戏软件 C++主要就是做UI. 而UI部分,用C++开发的很少. 嵌入式,大多连C++的编译器都不支持. 除非是终端部分. 游戏逻辑,都有嵌入式语言支持.
我是隐形人
回复 @宏哥 : JAVA就开发了一些安卓程序,就嘚瑟城这样,要是一开始不是安卓只支持JAVA,能有JAVA什么事,甚至因为JAVA让安卓背上卡顿的名头,甚至经常被苹果用户嘲笑,JAVA也就做做安卓小游戏,大游戏用JAVA,游戏行业会告诉你它的残酷性,JAVA也就能做做卡顿的安卓程序了
幻の上帝
幻の上帝
学究?GotW这种?嫌不够丢脸可以当面去喷Herb Sutter试试(人家应该没兴趣鸟)。不知道是不是这种坐井观天得太多了,我大天朝在isocpp.org里面居然都没存在感,就今年提过一个proposal……
青萍之末
青萍之末
不是第一个产品
宏哥
宏哥
等你吧产品release出来,再说扯淡不迟. 游戏行业的残酷性,会告诉你答案.
1
子达如何
子达如何
很奇怪,为什么要调试STL的?
临峰不畏
临峰不畏
是谁说嵌入式不能用C++,说明嵌入式编译器对C++不兼容?eCos嵌入式操作系统是C++写的,这是怎么回事儿?我之前用MDK做一个STM32的嵌入式程序,就用C++写,挺好的。
0
宏哥
宏哥

http://www.oschina.net/question/96003_58717

http://www.oschina.net/question/96003_58725

立刻设为最佳答案

用STL只会浪费你的时间,让程序变得臃肿,难以调试. C++委员会根本不知道他们要干什么.

C++是一门没有人懂的语言,不管是设计,使用它的人,还是标准委员会.如果你必须用C++,就按照C的方式来使用.

所有系统级别的软件,都是建立在C之上.

s
ssdkkkflll2222
如果看过STL或者早期SGI代码,知道STL效率是很高的。 包括bootst。现在我在看的机器学习库caffe就大量用到boost代码。所以你觉得STL效率低是错误的。一个不会用开源库而去手鲁代码的程序员开发效率肯定很低,而且STL的代码大多是效率极高的实现方式。 不过滥用STL确实会导致代码臃肿和性能凭借,不过这不是程序员拒绝STL的理由。
临峰不畏
临峰不畏
如果你觉得臃肿,那说明你的思维模式还停留在C的模式。
幻の上帝
幻の上帝
STL会用到浪费时间,这啥智商。。。难道手撸动态数组和链表开发效率还高了不成。
0
gzwxn
gzwxn

分配器对于使用库的人来说是完全透明的,迭代器是必备的吧。。

假如不用STL,那你用什么呢?自己写字符串、链表这些早已被无数人分别实现了千百遍的基本数据结构?

我觉得string/wstring的实现的确是有值得商榷之处,当然,这也是C/C++的优点,编译器的实现复杂度大大降低了。

假如是用C++开发的,要我是肯定是用STL,省心省力。

0
mallon
mallon
如果程序结构复杂,我宁可用Lua + C也不用C++,C写底层接口,Lua编排上层逻辑
0
宏哥
宏哥

引用来自“mallon”的答案

如果程序结构复杂,我宁可用Lua + C也不用C++,C写底层接口,Lua编排上层逻辑
我会选择python,缺点就是尺寸大了点,不过,也比那个狗屁STL,boost要苗条.
Landoky
Landoky
虽然我也在用C++,但是,如果一个项目太过于庞大,我也认为,C做基层,Lua做逻辑控制的效率更好。
jiuyueshouyi
jiuyueshouyi
STL到底有多大需要你们这么操心,反正我是没感觉到,从编码到编译到链接,没有觉得STL有那么狗屁 如果程序结构复杂,用lua来做逻辑,这是什么逻辑?
0
soon
soon

引用来自“宏哥”的答案

http://www.oschina.net/question/96003_58717

http://www.oschina.net/question/96003_58725

立刻设为最佳答案

用STL只会浪费你的时间,让程序变得臃肿,难以调试. C++委员会根本不知道他们要干什么.

C++是一门没有人懂的语言,不管是设计,使用它的人,还是标准委员会.如果你必须用C++,就按照C的方式来使用.

所有系统级别的软件,都是建立在C之上.

@宏哥 不用stl的话,难道真的自己写链表这些结构?正在被stl强j的人求解答。

我也觉得stl之流很恶心,但是又不得不用(不想自己写)。

boost倒是的确可以扔进垃圾桶了。

c++标准委员的脑袋都是被地铁门夹过的,新标准里面加的都是些没用的东西,真正有用的什么都没加。

s
ssdkkkflll2222
你真的了解boost吗。 boost很多功能都非常强大,只是一般程序员用不到。
0
岛

反正我用着舒服就好,但凡喜欢批评的,大多也是半桶水。

返回顶部
顶部