Boost 是否有害?

52

很多关于C++问题的答案都包含以下回复:

"你应该使用boost::(插入你喜欢的智能指针)或者更好的是boost::(插入你喜欢的超级复杂的boost类型)"

我并不完全相信这对于那些明显是C++新手的提问者有任何帮助。我的理由如下:

  • 不理解智能指针内部工作原理就使用它们,会导致一代C++程序员缺乏一些基本的编程技能。在Java领域中,这似乎已经发生了。

  • 决定使用哪种类型的智能指针很大程度上取决于所处理的问题域。这几乎总是在这里发布的问题中缺失的,因此简单地说“使用共享指针”可能至少没有帮助,可能完全错误。

  • Boost尚未成为C++标准的一部分,并且可能在提问者使用的特定平台上不可用。安装它有点麻烦(我刚刚使用Jam安装了它),如果您只想要几个智能指针,那么这将是过度杀伤力。

  • 如果您正在编写FOSS代码,则不希望代码过于依赖外部库,因为再次,您的用户可能没有这些库。由于库之间的拜占庭式复杂性,我曾多次放弃使用FOSS代码。

最后,我并不是说不推荐Boost,而是我们在这样做时应该更加小心。


“他人如何看待”已经说明一切,你正在征求意见。那本质上是主观的。事实将是客观的。 - MSalters
1
你有什么问题?Stack Overflow (SO)特别针对受欢迎的答案,而你似乎在说你不喜欢那些受欢迎的答案。 - Drew Dormann
2
既然我们现在都有自己的观点,那么我的观点是希望这将是最后一代C++程序员,所以我不介意他们是否理解它。 - Joe Phillips
2
这是一条留言给回答者的信息,实际上并不是一个问题。看起来这是一个论坛帖子,在一个问答网站上。 - Mark Rogers
19个回答

94

一些要点:

  • 使用任何东西而不了解其原理都是有害的。但最终只有无知的技术使用者(和他的经理)会受到伤害。
  • 你不需要安装boost就可以获得智能指针-它们只是头文件。而且安装本身相当简单,在最简单的方法中只需输入一两个命令。
  • 许多Boost库和解决方案已经出现在TR1中,或将在C++0x中出现。
  • 你总是会依赖外部库... 尽量选择那些在维护和支持方面前途光明的库。
  • 除非你想推出自定义解决方案-这将具有某些优缺点。

69

C++不是一门适合新手的语言。抱歉对Scott Meyers,一个初学者不仅要学习C++的一门语言,而是四个方面:

  1. C语言部分
  2. 面向对象部分:类、继承、多态等
  3. STL:容器、迭代器、算法
  4. 模板和元编程

如果初学者已经攀登到这座山顶,我认为应该从开始就指向C++的更“现代”方面。否则,初学者将会学习类似于C的C++,使用常规指针、资源泄漏等,然后发现自己处在痛苦之中,然后才发现Boost和其他库可以减轻痛苦。

无论如何,这是一个复杂的情况,为什么不指向一个具有积极回报的方向呢?

关于依赖项,大量的Boost是只有头文件的。而Boost的自由许可证应允许其包含在任何项目中。


29
我使用C++编程已经有一段时间了,最近才开始(通过StackOverflow)探索标准库。这部分原因是我曾参与一个无法使用STL的项目,也因为我对此一知半解。在阅读了《C++标准库:教程与参考》的几章之后,我实际上目瞪口呆地坐着,惊讶于我曾认为可怕的语言能以如此少的行数完成一些事情(我以为只有动态语言才能做到这一点!)。 - Edan Maor
7
你肯定只读了STL部分,其他的正好相反。“他们究竟是怎么把它弄糟的?” - Matt Joiner

44

你知道编译器是如何工作的吗?你知道操作系统是如何工作的吗?你知道处理器是如何工作的吗?你知道电子学是如何工作的吗?你知道电是如何工作的吗?

在某个时候,你会使用一个黑盒子,问题是,“我的无知对我当前正在做的事情有问题吗?”。

如果你对知识有兴趣,那是很好的一件事情——我在面试工程师时也认为这是一个优点——但不要忘记你工作的目的:构建解决问题的系统。


60
我一直遵循的经验法则是我很久以前从一位计算机科学教授那里学到的,即“要在 N 级抽象层次上有效地工作,必须具备 N-1 级的工作知识和 N-2 级原理的理解”。 - Tim Lesher
2
你知道编译器是如何工作的吗?你知道操作系统是如何工作的吗?你知道处理器是如何工作的吗?你知道电子学是如何工作的吗?你知道电力是如何工作的吗?虽然不需要了解这些,但我们关心scoped_ptr如何删除对象以及shared_ptr为什么不会 :) - Johannes Schaub - litb
12
回答这些问题:是的,不幸的是是的,是的,是的,还有是的。我真的希望我不这样。 - greyfade
2
@Tim,那几乎让人震撼。我希望我也有像那样的计算机科学教授。 - prestomation
2
实际上,当我去大学时,在学习编码之前,要求你真正理解电力以及计算机中所有门的工作原理。是的,在那些日子里,我们确实也编写操作系统代码...天啊,我真的老了。 - Jason Short
显示剩余5条评论

27

我不同意。没有人会建议您在彻底了解背后发生的事情之前就开始使用智能指针,但是如果明智地使用它们,它们可以消除许多常见错误。此外,Boost是高质量的生产代码,C++新手可以从中学到很多东西,包括设计和实现方面。并不是所有的都非常复杂,你可以选择需要的部分。


21
  • 不能一直彻底理解所有事情,所以相信许多专业的C++开发人员的话,Boost的许多部分确实是在日常开发中非常有用的东西。
  • C++0X中包含了相当多的boost,这证明了即使是管理语言演变的团队也认为boost是一个好东西(tm)。
  • C++是一门奇怪而严格的语言。与其难以掌握的程度相比,它相对容易学习。你可以使用一些非常晦涩的方法。Boost::mpl基于其中的某些晦涩内容。我喜欢boost,但每当我看到组织中有人使用boost::mpl时,我都会感到痛心。原因在于:即使经验丰富的C++开发人员也很难理解它的工作原理,并且使用它的代码通常反映出这一点(最终它看起来像是某个人一直敲代码直到它能够工作为止)。这是 好的事情,因此我部分同意一些boost的部分不应该轻易使用(boost::spirit就是另一个例子)。
  • C++标准也是一件奇怪的事情。大多数常见编译器不支持所有现有的标准(例如模板导出)。它只是一个预期的指南。
  • 如果你的开发人员没有决定在特定情况下使用哪个智能指针的技巧,也许他们不应该在没有高级指导的情况下搞乱代码的那一部分。
  • 总是有外部库,从运行时开始。Boost的很多内容都只是头文件,因此不会引入新的外部依赖项。

15

说实话,对于初学者来说,我认为boost不是特别适合。我认为初学者最好先理解基础知识,然后再使用更高级的工具/库,如boost甚至STL,以此循序渐进。在初学阶段,重点不是效率,而是理解。我认为了解指针的工作原理,例如能够手动创建链表或对其进行排序,都是每个程序员应该学习的基本要素。


4
初学者是指什么?我认为初学C++的人最好从一开始就使用高级结构,然后逐渐深入学习。教他们一种方法,然后告诉他们“不要这样做”是没有什么意义的。 - David Thornley
一个专业的程序员不会说“不要使用指针”,而是会说“尽量避免使用指针”。我认为这样做有一定道理。首先,我们必须了解问题所在(指针无法自动管理和跟踪),然后才能找到解决方案(智能指针)。就像我在我的回答中所展示的那样。 - Johannes Schaub - litb
我遇到过很多程序员不知道如何使用指针,原因是他们从未需要过。通过从高级构造开始编程,存在很大的风险,你永远不会去学习内部工作原理。在我看来。 - AndersK
2
但这是关于生产力的——工程不是慈善工作。 - Dustin Getz
我的观点只是说,作为初学者使用boost可能会错过一些语言的基本内部知识。当你不得不处理旧的遗留C++程序时,这种技能可能会派上用场。 - AndersK

10

我认为Boost是一个很棒的库,我喜欢它。我最喜欢的库是boost::bind和boost::function,它们使函数指针更加灵活易用。它非常适合不同的框架,可以保持代码整洁。

我也使用不同的Boost类。例如,我使用boost::graph创建图类,使用boost::filesystem处理目录中的文件。

然而,Boost非常复杂。您需要成为经验丰富的程序员才能了解其价值。此外,您至少需要有一些C++的经验才能理解Boost的工作原理以及在这里或那里使用Boost的影响。

因此,我强烈建议经验丰富的程序员看看Boost,特别是如果他们试图重新发明轮子。它确实可以像广告上说的那样:对您的目标产生推动作用。

然而,如果您感觉提问者是初学者,并尝试理解(例如)内存分配,告诉他尝试boost智能指针是一个非常糟糕的想法。这根本没有帮助。智能指针类等的优点只有在经历了标准内存分配技术的工作后才能理解。

最后,Boost不像开自动挡车一样简单。它就像学习驾驶F1赛车。


Boost的某些部分就像赛车一样。而其他部分,例如智能指针,可以轻松地插入,比不插入它们会引起更少的问题。 - David Thornley

10

我完全同意你的观点。这就是为什么我首先解释它们应该如何操作(例如,当推荐使用boost::variant时,我会解释他们通常应该使用有区别的联合。我尽量不说这只是一种"魔术boost工具",而是展示他们原则上是如何实现它的。当我推荐boost::shared_ptr时,我解释他们需要使用指针 - 但最好使用具有共享所有权语义的智能指针)。当我看到提问者是初学者时,我尝试不仅仅说“使用boost::xxx”。C++不像某些脚本语言那样易于使用的语言。一个人必须理解自己所使用的东西,因为语言不能保护程序员免受错误行为的影响。

当然,新手不可能从一开始就全部理解。但是,他们应该基本了解他们的boost库解决了什么和如何解决的。

这不能与先学习处理器或汇编语言相比较。类似地,知道空指针的位模式是什么样子并不重要。在学习C++编程之前,这些知识都是无关紧要的。但是,指针、数组或其他任何C++的基本内容都很重要。在成功使用[boost|std]::shared_ptr[boost|std]::array之前,必须先了解它们。在我的看法中,这些是必须首先理解的内容,以成功使用boost实用程序。这不是关于像如何使用裸指针手动实现pimpl习语这样的细节 - 这不是我想表达的。而是说一个人应该首先了解指针或boost库有助于解决的其他部分(例如,对于指针,它们是什么,它们有什么作用)。只需查看shared_ptr manual并尝试在不了解指针的情况下使用它。这是不可能的。

并且重要的是始终将他们引导到适当的boost手册。Boost手册具有高质量。


作为一名C++开发人员,了解shared_ptr如何包装指针是必要的吗?为什么对于初学者来说先使用原始指针更好呢? - David Thornley
因为初学者必须理解指针是什么。shared_ptr使用原始指针进行初始化。而且C++语言也涉及指针。这是一种基本结构,是C++语言固有的一部分。 - Johannes Schaub - litb
我并不是说初学者应该在他们的生产就绪程序中使用指针 - 当然不是。但是,在使用智能指针时,他们应该熟悉它们。 - Johannes Schaub - litb
顺便说一句,我不是在谈论尝试将原始指针用作类成员之类的事情。我的意思只是基本用法(例如,它们本身就是对象,并将地址存储为它们的值)。我完全同意应该晚些时候教授它们的应用程序[...] - Johannes Schaub - litb
[...] 当涉及到有趣的细节时,我们可以深入探讨。但是,在教授智能点的同时,应首先教授其基本含义和手动操作可能出现的问题。...好了,现在我会停止在评论区里灌水 :p - Johannes Schaub - litb
显示剩余4条评论

7
几乎所有回答中的共识是,对于有经验的开发人员和复杂的实际C++软件来说,boost非常有价值。我完全同意。
我也认为boost对于初学者来说是非常有价值的。使用lexical_cast比使用ostringstream更容易,或者使用BOOST_FOREACH而不是迭代器语法?大问题在于缺乏好的boost文档,特别是对于初学者。需要一本书告诉你如何开始使用boost,哪些库是简化任务的简单库,哪些库更加复杂。使用这些库以及良好的文档将使学习C++更加容易。

6

在可能的情况下,我们应该鼓励使用标准 canned 库(Boost 几乎可以视作标准库)。

有些人认为初学者应该先学习 C++ 的 C 部分,然后再逐渐引入更高级别的东西。然而,人们往往按照训练方式工作,因此我们会看到很多使用不良管理的原始指针(即使是良好管理的原始指针有时也很困难)、数组(以及无法避免的 delete 和 delete [] 之间的混淆)等编写的生产代码。我曾经用过这样的代码。我不想再次这样做。

从你想让他们编写代码的方式开始培养初学者。这意味着首先教授他们关于 STL 容器和算法以及一些 Boost 库的知识,所以当需要一组东西时,他们首先考虑的应该是一个 vector<>。然后教授他们较低层次的结构,以便在遇到它们时了解它们(或在极少数需要微观优化的情况下查找它们)。

基本上有两种类型的程序员:编码人员和爱好者。编码人员应该按照应该编写它们的方式来学习语言,而爱好者将学习低级别的东西,包括操作系统原理、C、汇编代码等。在前期学习他们要使用的编程语言时,两者都能得到很好的服务,而只有爱好者能从一些基础知识的任意级别中受益。


抽象化程度太高,无法想象会有好结果。我亲眼见证了现代工具包的结果,代码比使用C++还要可怕得多!C++中的C非常丑陋,但也很直接,可以轻松替换和重构。没有过多的抽象化需要进行全面重写。这是一种系统语言,你需要知道实现原理,否则你根本不应该首先使用C++。 - J. M. Becker
@J.M.Becker,你所说的直接违背了我超过15年的经验。我见证了使用现代工具的结果,它比C子集干净得多。现在,一个不称职的程序员可能会用C++搞砸一切,但在称职的人手中,它对许多事情非常强大。它不仅仅是一种系统语言。 - David Thornley
David,他们并没有教授关于什么时候以及在什么样的任务中使用C++是合适的,或者不合适的。说“如果性能变得可怕…”离使你的立场成为正确选择还有很远的距离。我并不是说不要教授C++,我是说你需要尊重它的强大,因为它有必须被理解的缺点,才能在不超过好处的后果的情况下使用它们。它不仅仅是一种系统语言,但它总是一种系统语言。 - J. M. Becker
我的观点是STL是一个更好的起点,而不是boost库,他们需要了解C运行时提供了什么以及没有提供什么。他们需要了解所有内置结构,然后确定何时使用STL是最明智的选择。在那时,你可以谈论何时使用boost获取优势是安全的,何时不安全。 - J. M. Becker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接