不使用STL的原因?

时间:2011-02-03 14:40:19

标签: c++ stl

  

可能重复:
  To STL or !STL, that is the question

是否有人应避免在他/她的项目中使用C ++ STL?

10 个答案:

答案 0 :(得分:6)

如果您无法使用RTTI和/或例外,您可能会遇到STL的某些部分无效。这种情况例如是适用于原生Android应用。因此,如果它不能满足您的需求,那就是不使用它的理由!

答案 1 :(得分:6)

当您选择使用像Qt这样的框架时,您可能会考虑使用Qt中的列表,向量等而不是STL。在这种情况下不使用STL可以使您不必在需要在GUI中使用STL时将其从STL转换为Qt等效。

这是有争议的,并不是每个人都想使用Qt的所有内容

来自http://doc.qt.nokia.com/latest/containers.html

  

这些容器类设计为比STL容器更轻,更安全,更易于使用。如果您不熟悉STL,或者喜欢以“Qt方式”执行操作,则可以使用这些类而不是STL类。

答案 2 :(得分:4)

如果您非常关心可执行文件大小,那么您可能希望避免在程序中使用STL。

例如,uTorrent不使用STL,这就是它如此之小的一个原因。

由于STL确实依赖模板(毕竟是标准的TEMPLATE库),很多时候你使用模板,编译器必须为处理STL时使用的每种类型生成额外的代码。

这是编译时多态,并且会越多地使用它来增加可执行文件的大小。

如果从项目中排除STL(并且谨慎使用模板或根本不使用模板),则代码大小会变小。请注意,它不一定会更快。

另请注意,我不是在讨论程序在执行期间的内存使用情况,因为这取决于您在应用程序生命周期内分配的对象数量。

我在谈论你的二进制文件的可执行文件。

如果你想要一个例子,请注意一个简单的Hello world程序在编译时可能比一个巧妙的代码demo更大,它可以包含一个非常小的可执行文件中的整个3D引擎(生成的运行时)。


关于uTorrent大小的一些信息:

Official FAQ (from 2008), this question doesn't appear in recent FAQ.

How was uTorrent programmed to be so efficient?

Second post regarding this.

Third post regarding this.

请注意,即使uTorrent大于300kb且使用UPX进行压缩,但考虑到它能够做什么,它仍然非常小。

答案 3 :(得分:3)

我想说在某些情况下,您可能会在项目中没有使用STL的特定功能,因为您可以根据自己的需要自定义编写它。 STL集合本质上是通用的。

您可能需要代码:

  • 线程安全的无锁容器。 (STL不是)。
  • 一个字符串类,它本质上是不可变的,并且“通过引用”复制实际数据(使用某种机制)。
  • 一个高效的字符串构建类,它不是ostringstream(不是STL的一部分,但你可能意味着所有的标准库)
  • 使用Map和Reduce的算法(不要与std :: map混淆.Map和Reduce是一种使用多个线程或进程迭代集合的方法,甚至可能分布在不同的机器上)。

嘿,看,因为标准库当时提供的内容并没有真正满足程序员的需求,因而提供了替代方案,所以写了很多内容。

我不确定这是不是你的意思,或者你是否特别认为STL应该在任何时候被“禁止”(例如设备驱动程序编程,模板被认为是膨胀的,即使并非总是如此)。

答案 4 :(得分:3)

不是真的。没有理由禁止使用整个库 - 除非lib只提供一个函数,而标准库不是这种情况。应该按功能评估提供的工具 - 例如,您可能认为您需要一个比vector更具体的容器,但这并不是禁止使用{{deque的借口。 1}},iostreamfor_each

更重要的是,通过模板生成的代码不会比手工编写的等效代码更臃肿。您不会通过拒绝使用std::vector然后为float和double编写等效向量来保存代码膨胀。特别是在2011年,与绝大多数情况下的媒体等大小相比,可执行文件的大小毫无意义。

答案 5 :(得分:3)

如果你正在努力达到禁止它的特定标准。

例如,MISRA C/C++ guidelines针对汽车和嵌入式系统,并禁止使用动态内存分配,因此您可以选择完全避免使用STL容器。

注意:MISRA指南只是可能影响您选择使用STL的标准示例。该特定指南不排除使用STL的所有。但是(我相信)它排除了使用STL容器,因为它们依赖于内存的运行时分配。

答案 6 :(得分:2)

它可以增加可执行文件的大小。如果您在嵌入式平台上运行,则可能希望排除STL。

答案 7 :(得分:1)

当你使用类似Qt库的东西来实现相同的功能时,你可能不需要STL。可能取决于其他需求,如性能。

答案 8 :(得分:0)

唯一的原因是,如果您正在使用内存较低的嵌入式系统,或者您的项目编码指南明确禁止STL。

我没有其他合理的理由手动推出自己的不兼容,错误的STL上的一些功能实现。

答案 9 :(得分:0)

TR18015处理STL的一些限制。它从不同的角度看待它 - 编译器可以做得更好 - 但仍然是一个有趣的(如果深入)阅读。

我对微处理器和小型嵌入式系统一般都要小心。首先,编译器优化不符合您对桌面的了解,会更快地遇到硬件限制。

话虽如此,这很大程度上取决于您使用的库。众所周知,I / O流很慢(并且需要仔细实现),而std::vector只是一个薄的包装器。