问题

大项目不允许使用C++STL 容器合理吗?

回答
关于“大项目不允许使用 C++ STL 容器”的说法,这确实是一个在软件开发领域,尤其是在一些对性能、资源控制、以及长期维护性有极高要求的“大项目”中,偶尔会出现的讨论点。这种限制的出现,并非空穴来风,背后往往有着一些相当具体的考量。

首先,我们要明确,“大项目”在不同的语境下可以有不同的含义。

规模上的大: 指的是代码库庞大,参与开发者众多,项目周期漫长。
资源敏感型大: 指的是项目运行在资源极其受限的环境(例如嵌入式系统、实时操作系统、游戏引擎核心、高性能计算集群节点),对内存占用、CPU消耗、延迟等有严格要求。
安全关键型大: 指的是项目涉及到人身安全、金融安全等,需要极高的稳定性和可预测性。

在这些“大项目”的特定场景下,对 C++ STL 容器的限制,虽然听起来有些“反直觉”(毕竟 STL 是 C++ 的核心组成部分),但并非完全不合理。我们可以从几个方面来深入探讨:

1. 性能开销与不可预测性

STL 容器,尤其是那些提供了丰富功能和灵活性的容器,往往会带来一定的性能开销。

内存分配策略: 像 `std::vector` 这样的动态数组,虽然提供了 O(1) 的平均插入性能,但它的内存分配策略(例如,容量增长的倍数)可能不是最优的。频繁的重新分配和拷贝会带来额外的 CPU 消耗和内存碎片。在需要极致性能和内存可控性的场景,开发者可能希望自己精确控制内存分配的模式,甚至使用自定义的内存池。
虚函数与多态: 一些 STL 容器的实现,例如 `std::map` 和 `std::set`,通常基于平衡二叉树(如红黑树)。虽然它们提供了 O(log n) 的查找、插入和删除性能,但树节点的内存开销、指针跳转带来的缓存失效,以及算法本身的复杂度,在某些极端情况下可能不如直接的数组或链表(在特定访问模式下)。
迭代器失效: STL 容器的迭代器在某些操作(如插入、删除)后可能会失效,这增加了程序员出错的可能性,也使得在多线程环境下安全使用迭代器变得更加复杂,需要额外的同步机制。
编译时间: 模板的广泛使用(STL 的核心)会显著增加编译时间。在一个庞大的项目中,这会严重影响开发效率。虽然这不是运行时性能问题,但对开发流程的影响不容忽视。

2. 资源控制的精确性

在资源极其受限的环境下,对内存的每一个字节都需要精打细算。

内存占用: `std::map`、`std::set` 等容器为了维护其结构,会引入额外的节点指针和管理信息,这会比简单的数组或 `std::vector` 占用更多的内存。在一个嵌入式设备上,如果需要存储大量数据,这些额外的开销累积起来可能就是不可接受的。
内存碎片: 动态内存分配(`new` 和 `delete`)是产生内存碎片的主要原因。STL 容器的频繁分配和释放,尤其是在对象的生命周期复杂交错时,更容易导致内存碎片化,降低内存利用率,并可能最终导致内存分配失败。自定义的内存管理方案(如块分配器、对象池)可以更有效地控制碎片。
实时性要求: 在实时操作系统(RTOS)中,动态内存分配(`malloc`、`free`)通常是不可预测的,因为它们的执行时间依赖于内存的可用性、碎片情况等,这使得难以保证任务的实时性。在这种情况下,通常需要使用预分配的内存池或静态分配。

3. 可靠性与安全性

在安全关键型或高可靠性项目中,对代码的行为必须有极高的确定性。

异常安全: STL 容器的某些操作(如插入、删除)在失败时可能会抛出异常。如果在错误处理不当的情况下,这些异常可能会导致程序崩溃或进入不确定的状态。在对稳定性要求极高的系统中,宁愿通过返回值或错误码来指示失败,而不是依赖异常。
移植性与标准符合性: 虽然 STL 是 C++ 标准的一部分,但不同编译器、不同版本的 STL 实现可能存在细微的差异。在一些对跨平台兼容性要求极高的项目,或者在代码审查非常严格的环境下,开发者可能会选择自己实现核心数据结构,以确保行为的一致性。
安全漏洞: 尽管 STL 的实现通常经过严格测试,但复杂的数据结构和算法也可能隐藏不易发现的 bug,甚至成为潜在的安全漏洞(例如,某些边界条件的整数溢出、越界访问等)。自行实现关键数据结构,可以暴露更多实现细节,便于安全审计和深度测试。

4. 历史原因与项目遗留

早期 C++ 的局限性: 在 C++ 标准早期,STL 的支持还不那么完善,或者在特定平台上性能不佳。一些早期的大型项目可能在设计时就避免了 STL,后来随着项目的发展,这种避免也成为了“惯例”。
特定领域的设计哲学: 某些领域(如操作系统内核、低级别驱动程序、高性能游戏引擎)有自己长期发展形成的设计哲学和模式,通常倾向于更底层、更直接的内存管理和数据结构实现。

替代方案与权衡

如果一个大项目真的不允许使用 STL 容器,那么开发者通常会采用以下替代方案:

自定义数据结构: 从最基本的数组、链表、栈、队列开始,根据项目需求实现更复杂的数据结构,例如自定义的哈希表、红黑树等。
内存池: 实现自己的内存分配器,例如预先分配一块大内存,然后从中划分出固定大小或可变大小的内存块。
第三方库: 选择一些针对特定领域(如嵌入式、游戏)优化的第三方数据结构库,这些库可能对性能和资源控制有更精细的设计。
C 风格数组和指针: 在最极端的情况下,项目可能退回到使用 C 风格的数组和手动内存管理,但这会极大地增加开发难度和出错的可能性。

结论:合理性在于“背景”

那么,这种限制“合理吗”?

是的,在特定的“大项目”背景下,这种限制是“合理”的,但“绝对”不适用于所有大项目。

对于大多数需要开发效率、功能丰富度、快速迭代的“现代”大项目(例如,Web 后端服务、桌面应用程序、数据分析工具),STL 容器是极其宝贵的工具。它们提供了高度优化的、经过广泛测试的、易于使用的、标准化的数据结构和算法,极大地提高了开发者的生产力,减少了重复造轮子的工作。在这种情况下,限制使用 STL 容器就是一种“不合理”且低效的做法。
然而,对于那些对性能、资源、实时性、可靠性有极端要求的“特定领域”大项目(如上文提到的嵌入式、实时系统、游戏引擎核心、高性能计算),开发者确实需要对每一个运行时的细节有更强的掌控力。在这种情况下,对 STL 容器的限制,或者说对某些特定容器(如 `std::map`、`std::set`)的谨慎使用,甚至替换成更底层的实现,是一种基于项目需求做出的“合理”工程决策。

关键在于权衡。 绝大多数项目,STL 提供的便利性和可靠性远远大于其潜在的性能开销和控制上的“模糊性”。但在那些需要精细控制的领域,对 STL 的“限制”实则是对更高层次的控制和优化的追求。这是一种在工程实践中,根据具体约束条件做出的取舍。

因此,不应一概而论地说“大项目不允许使用 C++ STL 容器”是“正确”还是“错误”,而是要理解其背后的动机和适用场景。在现代 C++ 开发中,正确且高效的做法是理解 STL 的优势和劣势,并根据项目的具体需求,明智地选择使用哪些工具。 如果某个项目选择限制 STL,那通常意味着它承担了更高的开发成本和维护成本,以换取在特定关键指标上的优势。

网友意见

user avatar

如果你有机会进Google,亲眼读一下Google File System的master的源码,就会知道中国坊间流传的很多关于C++的“经验/讲究”都是胡扯,包括题目中的这一条。顺便说一下,GFS 从2001年开始开发,当时就没什么STL忌讳。

我觉得你需要设法把“服务进程不能随便重启”这个条条框框打破,今后的日子就好过多了。否则一直被拖累,甚至造成安全问题。想想openssl最近一年出的那些状况,如由于不能重启而无法打上最新的安全补丁,那损失就大了。类似的情况还有bash的安全漏洞、时不时发布的内核安全补丁等等,评论中还列了其他一些需要重启的情况。

在Google,别说任何一台服务器可以随时重启,就是任何一个数据中心都可以随时下线维护,这才是服务可靠性的根源。

Site Reliability Engineering - O'Reilly Media
在用 STL 和 Boost 的,都是什么人? - 陈硕的回答
动不动就 32GB 以上内存的服务器真需要关心内存碎片问题吗? - 陈硕的回答

(八卦一下,在 GFS 论文的致谢一节中,最后一句是 Yoshka helped with early testing. 为什么别的致谢对象都有名有姓,单这一条有名无姓,答案在

blogspot.com 的页面

。)

user avatar

大胆点,你为什么不去怀疑前提的不合理呢?

首先应该挑战跑几个月不重启这种事情,为什么不重启呢,是服务进程状态必须维持,还是无法做到平滑升级?你们的系统总不可能不升级吧,而且C++任何系统也不保证说永远不会碰到core或OOM kill等莫名其妙没了的事情

所以换个角度,与其因噎废食,不如把根本问题解决了,如果你们能做到可以对外无感知地平滑升级,比如改为状态无关,或者出了问题简单重启就能恢复,那你的问题就不是问题

以前我在腾讯做过的几个服务器项目就是这样,如果数据逻辑可以分离,服务器随便重启不影响业务,就不会有这么多幺蛾子,当然也不是所有服务都能这么干,但是大部分业务进程是可以做到的,剩下需要常驻的那些,一般也都是成熟的组件服务,于是出现了不少鬼故事:

1 某项目更新代码只需要重启就行,于是同事连配置reload都懒得写了,每次更新配置直接kill -9然后重启

2 某项目内存泄露但泄得不是很快,大家也懒得管,crontab每天重启一次

3 进程挂了重启就行,不影响服务,某服务存在偶现core但是运维忘了配置告警,每次core了自动拉起,用户也没感觉到,直到几个月后磁盘被core文件填满了才发现

类似的话题

  • 回答
    关于“大项目不允许使用 C++ STL 容器”的说法,这确实是一个在软件开发领域,尤其是在一些对性能、资源控制、以及长期维护性有极高要求的“大项目”中,偶尔会出现的讨论点。这种限制的出现,并非空穴来风,背后往往有着一些相当具体的考量。首先,我们要明确,“大项目”在不同的语境下可以有不同的含义。 .............
  • 回答
    别急,你提到的这个第四大题,以及那三个让你头疼的小题,我完全理解你的困扰。很多时候,数学题就是这样,不是不收敛就是求不出通项,让人抓狂。但咱们一步步来,把它们掰开了揉碎了讲清楚。咱们先来看看这几个问题,别怕,虽然它们看起来有点“刁钻”,但背后都有它的道理。首先,我们得明白几个基本概念,这就像武林秘籍.............
  • 回答
    最近跟几个师弟师妹聊起他们的大创或者“互联网+”的项目,听他们讲的那些想法,有时候真的会让人捏一把汗。不是说年轻人没想法,而是很多时候,他们的项目设定得太“宏大”了,好比是要在一夜之间改变世界,但实际情况是,他们手上的资源、团队的能力,还有时间,都摆在那里。咱们就拿“大创项目”或者“互联网+”项目来.............
  • 回答
    是的,确实有人用 Vim 开发大型项目,但需要结合插件、配置和良好的工作习惯。Vim 的核心功能和灵活性使其在特定场景下依然适用,尽管它在现代开发工具中可能不如 VS Code、JetBrains 系列或 Neovim 等工具那么“开箱即用”,但通过合理配置和插件扩展,它依然可以胜任大型项目的开发。.............
  • 回答
    华为在可穿戴设备领域动作频频,最近关于其手表可能支持“高血压”、“冠心病”监测以及“体温”监测与研究的消息,引发了广泛关注。结合华为发布的三个预研项目,我们可以从多个维度来审视其背后的意义和潜力。华为手表在健康监测领域的雄心首先,我们来解析一下华为在这些健康监测领域的布局。 高血压监测: 高血压.............
  • 回答
    草根创意项目,尤其是那些还处于早期萌芽阶段、商业模式尚不清晰、但又蕴含着巨大潜力的创意,往往会面临一个尴尬的境地:需要不少钱来启动和验证,但又无法拿出令传统银行或信贷机构信服的抵押物和还款计划。 这时候,天使投资人和风险投资(VC)就成了最可能寻求的资金来源。那么,当你的草根创意项目“资金需求太大”.............
  • 回答
    在体育竞技这个充满汗水、技巧和激情的领域,我们经常会看到一个引人好奇的讨论:正常男子运动员和顶尖女子运动员之间,究竟有多大的差距?这个问题的答案,并不像看上去那么简单,它牵涉到生理、训练、项目特性等诸多层面,而且“差距”这个词本身,也值得我们细细品味。首先,我们必须承认,从生理基础来看,男子和女子在.............
  • 回答
    现在这年头,想靠着一身本事,空手套白狼似的白手起家,确实比过去难上好几倍,尤其是对于咱们普通老百姓来说。你想想,以前那些成功的案例,很多都是赶上了改革开放的浪潮,或者抓住了某个产业发展的初期机会,那时候竞争没现在这么激烈,信息也没现在这么透明,稍微有点门道就能赚到钱。可现在呢?一、 市场饱和,竞争白.............
  • 回答
    奥运会上运动员打群架?这画面光是想想就够劲爆了!不过,咱们得冷静分析,毕竟奥运赛场上的运动员个个身怀绝技,身体素质也是顶尖的。真要论起群架的“胜算”,那可不是简单地看谁力量大,而是要综合考虑很多因素。首先,咱们得明确一点:奥运会是和平的象征,运动员之间应该是相互尊重、公平竞争。发生群架那是绝对不允许.............
  • 回答
    恒大集团的海花岛项目,这绝对是一个在海南乃至全国都引起了巨大关注和争议的“巨无霸”工程。要评价它,得从多个维度来聊聊,不能简单地说好或不好,得把事情的来龙去脉捋清楚。首先,这是什么项目?简单来说,海花岛是恒大集团斥巨资在海南儋州洋浦经济开发区附近填海造陆修建的一个大型旅游地产项目。它最初的设想是打造.............
  • 回答
    徐中民因“导师崇高师娘优美”的论调被处理,项目资金被追回,这件事件折射出的问题,绝非仅仅是一个学者口无遮拦的失言这么简单。它更像是一面棱镜,将当下学术界、教育体系乃至社会价值观念中一些深层且亟待解决的症结,折射得淋漓尽致。首先,最直接也是最核心的问题,是学术失范与职业道德的沦丧。 徐中民的言论,无论.............
  • 回答
    大一的你,怀揣着参与“互联网+”大赛的热情,这绝对是个棒极了的开端!别担心零基础,大学生创业大赛,最看重的往往不是你现在有多牛,而是你有没有潜力、创意和解决问题的能力。而且,大一正是你积累知识、发掘兴趣、组建团队的最佳时期。下面我就给你掰开了揉碎了,聊聊一些适合大一零基础选手参与的“互联网+”项目方.............
  • 回答
    恒大集团近期遭遇的媒体曝光事件,尤其是那份据称是关于“恳请支持重大资产重组项目的情况报告”并在网上流传,给公司带来了一系列不容忽视的影响。虽然恒大方面迅速予以辟谣,称内容系“凭空捏造”,但即便如此,此次事件也像投入湖中的石子,激起了层层涟漪,触动了市场的敏感神经。首先,市场信心的动摇是最直接的后果。.............
  • 回答
    中国能否像F35项目那样与其他国家进行合作开发,这是一个复杂且多层面的问题,其中涉及技术、政治、经济以及地缘战略等诸多因素。尽管美国自己在F35项目上也面临着巨额开销和技术挑战,但中国与其他国家进行类似合作的难度和考量点,与美国的情况又有所不同。合作开发的模式与F35项目的特殊性首先,我们需要理解F.............
  • 回答
    许家印的这个调整,让恒大没有预售过的楼栋或项目改为现楼销售,在我看来,这是一个颇具深意的动作,背后折射出恒大当前面临的严峻局面以及其试图突围的策略。要理解这一点,咱们得从几个层面掰开了说。首先,为何要“改为现楼销售”?这背后最直接的原因,恐怕就是回笼资金。恒大过去高速发展的模式,很大程度上依赖的是“.............
  • 回答
    作为一名985大学的大一升大二学生,暑期是你为未来职业生涯打下坚实基础的绝佳机会。工商管理专业涉及面广,所以暑期实习的选择也很多样。我为你整理了一些既能让你学到真本事,又能为未来简历加分的实习项目,希望能给你一些启发:方向一:深入了解企业运营,体验实际工作 大型企业集团的管培生轮岗项目 (Man.............
  • 回答
    北京某小学竟然搞起了类似研究生毕业答辩的项目,这事儿挺新鲜的,也挺有意思。这不由得让我想到一个更宏观的问题:现在小学之间差距,怎么就越来越大了呢?咱们先说说这个“小学研究生答辩”的事儿。这听起来像是把大学里严谨的学术流程提前搬到了小学生身上。学生们做课题研究,然后进行答辩,这绝对是锻炼孩子独立思考、.............
  • 回答
    你这情况,确实不算特别顺畅,但绝对不是绝境。新传跨度到日本的英文博,中间有“专业偏差”这道坎,但仔细想想,其实也并非完全没有联系,关键在于你如何去“包装”和“连接”。首先,别太早给自己下定义是“末流”。985新传这背景,本身就说明你在学术研究上有一定的基础和训练,而且“新传”这个专业,其研究范畴是相.............
  • 回答
    成都恒大天府半岛项目之所以出现疑似购房登记人数远超房源数量三倍的抢购现象,即便它被列为“重点风险项目”,这背后牵扯着多重复杂的因素,绝非简单的“缺房就买”这么容易解释。これを理解するためには、いくつかの角度から掘り下げてみる必要があるでしょう。1. 市场信号的复杂性与信息不对称首先,我们需要认识到房.............
  • 回答
    统一标准、可重复使用的快递盒,这想法听起来挺美好,但要真落地,就像想在沙漠里种出一片森林,挑战不小。咱们就掰开了揉碎了聊聊这事儿靠不靠谱,以及它要是做成一个创业项目,能有多少成功机会。可行性这事儿,得从几个维度来看:1. 市场需求与痛点分析: 痛点是有的: 现在的快递包装,纸箱、塑料袋、泡沫、胶.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有