如果你试图在一个库中链接少量的功能,同时发现链接时间的增加与你获得的收益不成比例,你也许尝试过重用重量级组件而不是轻量级组件。
对象的好处之一是在需要时很容易添加丢失的功能。面向对象范型这种几乎诱人的特性让许多一丝不苟的开发人员把高效、考虑完善的类转换成具有大量代码的“庞大恐龙”——绝大多数客户端没有使用大部分的类。图0-2描述了当允许一个简单的String类中的功能增长到满足所有客户端需求时,可能会发生的情况。每次为一个客户端添加一个新的特性,这潜在地增加了其余用户在实例规模、代码长度、运行时间以及物理依赖等方面的开销。
C++程序通常比实际所需要的大得多。如果不慎重处理,C++程序的可执行规模可能比用C所编写的等效程序要大很多。忽略外部依赖不计,过分雄心勃勃的类开发者创建了一些复杂的类,这些类直接或间接依赖于数量庞大的代码。应用特别细致的String类编写的“Hello World”程序,竟然产生了1.2MB的可执行文件长度。
像String类这种超重类型,不仅增加了可执行文件的长度而且使得链接过程十分缓慢而痛苦。如果链接String所需时间(连同它的所有实现依赖的时间)相比链接子系统花费在其他方面的时间要长,那么你就不可能费尽心思地去重用String了。
幸好,避免各种形式的不必要链接时依赖的技术出现了。