是否有人应避免在他/她的项目中使用C ++ STL?
答案 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?
请注意,即使uTorrent大于300kb且使用UPX进行压缩,但考虑到它能够做什么,它仍然非常小。
答案 3 :(得分:3)
我想说在某些情况下,您可能会在项目中没有使用STL的特定功能,因为您可以根据自己的需要自定义编写它。 STL集合本质上是通用的。
您可能需要代码:
嘿,看,因为标准库当时提供的内容并没有真正满足程序员的需求,因而提供了替代方案,所以写了很多内容。
我不确定这是不是你的意思,或者你是否特别认为STL应该在任何时候被“禁止”(例如设备驱动程序编程,模板被认为是膨胀的,即使并非总是如此)。
答案 4 :(得分:3)
不是真的。没有理由禁止使用整个库 - 除非lib只提供一个函数,而标准库不是这种情况。应该按功能评估提供的工具 - 例如,您可能认为您需要一个比vector
更具体的容器,但这并不是禁止使用{{deque
的借口。 1}},iostream
或for_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
只是一个薄的包装器。