为什么使用boost增加文件大小如此之多?
我注意到,当我使用增强功能时,应用程序大小往往会增加约.1 - .3 MB。这可能看起来不多,但与使用其他外部库相比(至少对我而言)。为什么是这样?为什么使用boost增加文件大小如此之多?
Boost使用模板无处不在。这些模板可以用相同的参数多次实例化。一个足够聪明的链接器将会抛出除一个副本外的所有内容。但是,并非所有连接器都足够聪明。另外,模板有时会隐含地实例化,甚至很难知道已经实例化了多少次。
“并非所有连接器都足够聪明”。因为如此愚蠢以至于留下相同代码的“多个副本”,有时也被称为“内联”;-)。但是,严肃地说,模板比静态库更容易内联。除非您将选项设置为只在内联时才会增加代码大小,否则会增加代码大小。这甚至在任何直接的低效率之前就像重复的非线性代码一样。 – 2010-01-23 03:24:30
您也将在每个引用每个头文件的每个obj文件中获得一份副本。由于大多数这些模板都是在其他模板的基础上实现的,因此它也使用多个模板来实现多个模板。在一个大项目中,您可以轻松获得成千上万的cout模板副本。 stl和boost的实现方式,代码无论如何都是怪异的膨胀。加上mem碎片和优化查杀发生得像疯了一样,因为有这么多func ptrs和smt ptrs。总之,不要使用boost,尽可能少地使用stl。 – 2010-01-23 04:15:31
@Charles:绝对可怕的一般建议。除非你特意要降低代码大小(这已经不再重要了),你应该尽可能地使用它们。 – GManNickG 2010-01-23 20:00:34
这一切都取决于它如何使用。由于Boost是一堆模板,因此会导致一堆成员函数按照使用的类型进行编译。如果使用n类型的提升,则成员函数被定义(通过C++模板)n次,每种类型一个。
“这么多”是一个比较术语,我担心你会比较苹果和橘子。仅仅因为其他图书馆较小并不意味着你应该认为Boost是一样小的。 看看Boost为你做的绝对量!
我怀疑制作具有相同功能的自定义库会有任何相当小的尺寸。唯一有效的比较是“Boost的X库”与“另一个X的库”。不是“Boost的X库”和“另一个Y库的库”。
文件系统库功能非常强大,这意味着很多功能,还有很多后台代码为您和我提供了一个简单的界面。此外,像其他人提到的一般模板可以增加代码大小,但它不是这样的可以避免的事情。模板或手工编码,无论是谁都会得到相同的尺寸代码。唯一的区别是模板要容易得多。
Boost主要由非常一般化且有时非常复杂的模板组成,这意味着类型和函数由编译器根据需要按照用途创建,而不是简单地通过声明创建。换句话说,少量的源代码可以产生大量的目标代码来实现声明或使用的模板的所有变体。 Boost也依赖于标准库,并引入这些依赖关系。然而,最重要的贡献是Boost源代码几乎主要存在于包含文件中。包含标准c包含文件(STL之外)通常包含非常少的源代码,并且包含大多数原型,小宏或类型声明而不实现它们。 Boost包含其包含文件中的大部分实现。
根据我的经验,如果你不得不使用Boost,也许你需要使用不同的语言来提供更多的内在特征提升,例如属性等...... Boost显着增加了,有时几乎达到了构建阶段的瘫痪程度,一个项目的时间。 – Jordan 2016-12-19 12:23:44
Boost的哪个部分? – GManNickG 2010-01-23 03:02:41
当前正在使用文件系统,lexical_cast,随机和绑定。 – Anonymous 2010-01-23 03:07:40
不要这么快接受答案。有些人甚至没有回答这个问题。这对dsimcha毫无意义,只是给别人一个机会。 :) – GManNickG 2010-01-23 03:09:03