C++ 现在最时髦的用法是 template meta programming。booster 们对此非常津津乐道,我本人也是个狂热的booster。到了什么程度?不使用template 就浑身不舒服,不boost一下就感觉对不起C++。但是这种狂热带来的严重后果就是程序编译速度极慢无比,生成的执行程序尺寸超常。
曾经一个 C++ 服务器程序,代码也就10000行左右,编译出来的执行程序竟然20M!编译时间半小时!写的时候感觉不到用了多少template,但是写出来竟然得到这样的结果,不得不让人吃惊!
记得在大学的时候(2000年前后),初学习 template 时,感觉template之间的耦合有点“过于松散”,就像只要有一个螺母,再一个螺栓,就可以往一起套,而不管他们是否一个是塑料,一个是金属,大小粗细是否匹配,螺距是否匹配,所有的这一切,如果只有哪怕一点点不匹配,都会在编译错误中造成一个非常令人费解的超长消息。当初也不知道这一点早已被无数人诟病了,就写了一片文章,自作聪明地提出应该对模板参数有个类似接口声明一样的规格定义(现在C++0x 中的对应物是concept)。当初立即招致骂声一片。现在这一点已经毋庸置疑了,C++0x出世后我们就可以结束这些痛苦了。
但是,前面说的C++的那两个致命缺点,看来短期内很难克服。
编译时间,受制于文件包含这种古老的内存不够用的时代的无奈选择,就像人的阑尾,喉头,视网膜。
程序尺寸,这个缺陷在某些时候也非常致命,举个简单例子,std::sort 使用了多种排序策略,每个sort 的机器码都很大。同时,对每一种数据类型,每一种randiter每一种comparator,都会生成一个sort 的版本,这会造成非常大的代码膨胀。相比之下,C 的 qsort 就没有这种缺陷。如果我们对几十种数据,使用几十个comparator排序,std::sort 的代码尺寸比 qsort 要大几十倍。虽然它在inline方面获得了优势,但是cpucache的失效,甚至是memcache的失效,造成的性能损失要大得多。BS在TCPL中提到的消除代码膨胀的方法,在某些情况下的确有用,但是太繁琐,大约也只有库编写者会使用它。
Java现在也支持泛型,据说不存在代码膨胀问题,但它的泛型只是语法糖,对程序性能好像没有提升。
C++ 怎样平衡代码膨胀和代码性能?是否可以为 template 生成 runtime meta info,用来操纵泛型算法。或甚至使用这些meta info 来在运行时生成真正的机器码。这样甚至可以允许在运行时进行template组装,而不是完全在编译时?这又有些类似于现代虚拟机(如Java HotSpot 虚拟机)的动态优化。
扯太远了,休息下。
分享到:
相关推荐
《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和...
缺点: C++单元测试三大框架的比较软件测试 1、TUT 结构框架简单。添加新的测试工作量小;无须注册测试;可移植性好(因其只需两个头文件,就可以完成测试工作);便于装卸;提供接口可以扩展其输出方式等。 最大的...
在现代编程环境中,C++在线编译器已经成为开发者和学习者的宝贵工具,它们提供了方便快捷的平台,可以在无需本地安装编译环境的情况下编写、测试和运行C++代码。以下是一些推荐的C++在线编译器及其特点: 1. **...
但是,它也存在一些缺点,如难以表达复杂的关系和数据结构。C++语言的面向过程编程特点使得它可以与其他语言集成,并且可以用于开发操作系统、数据库等底层软件。 程序的编辑、编译和运行的基本概念 C++程序的编辑...
本文将深入探讨在S60平台上ANSI C++与Symbian C++之间的差异,帮助开发者理解这两种编程语言在实际应用中的优缺点。 首先,ANSI C++(也称为ISO C++)是一种国际标准的C++版本,它定义了C++语言的语法、库和编译器...
调度是μC++中管理任务执行顺序的核心机制,分为隐式调度和外部调度两种方式,每种方式都有其适用场景和优缺点。 ##### 2.9.1 隐式调度 隐式调度是指由μC++内核自动管理的任务调度,适用于那些对响应时间和确定性...
通过比较引用和指针的优缺点,我们可以更好地理解何时使用引用。重载是C++中一种强大的功能,允许同一函数名根据参数列表的不同实现多种功能。重载不仅涉及函数的声明和定义,还与域、作用域以及函数指针的使用紧密...
这种方法的缺点是程序质量低下,进度延误,预算严重超支。为了解决这些问题,人们提出结构化程序设计方法,探讨了面向过程编程的3个基本结构,即顺序、分支、和循环。 面向对象的程序设计(OOP) 面向对象的程序...
C++ 文件读写操作总结 C++ 中的文件读写操作是编程过程中常用的操作之一,C++ Builder 提供了多种方法对文件进行操作。...基于 C++ 的文件操作的缺点是: * 相对复杂 * 需要了解 C++ 的面向对象编程机制
尽管 C++ 有许多优点,但它也有一些缺点: - **学习曲线陡峭**:C++ 相对于其他高级语言来说,语法更为复杂,学习成本较高。 - **易出错**:手动管理内存可能会导致程序出现各种错误,如内存泄漏等。 **2.4 C++ 的...
本文将深入探讨其中涉及的关键知识点,包括C++内存管理、操作符new和delete的区别、C、C++与Java的异同、继承的优缺点以及C++的面向对象特性。 首先,C++中的内存管理涉及到new、delete、malloc和free。new和delete...
4. 继承的优缺点 继承是一种面向对象的特点,它可以使子类继承父类的实现。但是,继承也有一些不足之处。因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现。此外,父类的任何改变都可能影响...
- 缺点:对初学者而言较为复杂,需要一定的C++基础。 3. **《Essential C++》** - 优点:简明扼要,适合作为入门教材。 - 缺点:有些读者可能会觉得内容略显浅显。 4. **《C++大学教程(第二版)》** - 优点:...
这两者都有其优点和缺点,书中的讨论有助于读者做出明智的选择。 通过阅读这两本书,C++程序员不仅能提升技术能力,还能培养出对语言内在复杂性的敏锐洞察,从而写出更高效、更可靠、更具可读性的代码。这不仅是...
传统的NULL宏有缺点:有些编译器会把NULL定义为空字符,即((void *)0),也就是0;有些则会直接把NULL定义为整数0。例如,对于定义的两个函数void f(int)和void f(char *),如果使用f(0),则编译器不知道去调用...
【Java和C++的区别】 Java和C++是两种广泛使用...总之,Java和C++各有优缺点,适用于不同的开发需求。选择哪种语言取决于项目的需求、团队的技能集和开发目标。理解它们之间的联系和区别,有助于做出最佳的编程决策。
《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和全局...