C ++的哪些特性在编译时特别占用资源?

我相信C编译通常比C ++更快,因为它缺少后期绑定和运算符重载等功能。 我有兴趣知道C ++的哪些功能倾向于最慢地减慢编译过程?


这是一个很难回答的问题。 如果你纯粹看每秒代码行(或者按顺序),毫无疑问C编译器应该比C ++编译器更快。 就其本身而言,这并不意味着很多。

在这个问题中提到后期绑定就是一个很好的例子:编译C ++虚拟函数的速度至少比编译C(非虚拟)函数要慢一些。 这并不意味着什么 - 这两者根本不相同。 C ++虚拟函数的等价物通常是一个指向函数的指针,或者代码使用枚举类型的开关来确定要调用的代码片段中的哪一个。

当你创建实际上相同的代码时,C是否会有任何优势是值得商榷的。 事实上,我的猜测是相反的:至少在我编写的编译器中,很多时间花在前端上,做相对简单的事情,比如只是标记输入流。 考虑到在C语言中这样的代码所带来的额外的时间长度,那么当你的代码实际上是相同的时候,如果它的编译结果大致相同甚至更慢,那么我不会感到惊讶。

运算符重载可能会产生相同的效果:一方面,重载运算符的代码几乎肯定需要一些额外的时间来编译。 与此同时,使用重载操作符的代码通常会更短,因为它使用重载操作符,而不需要通过名称来调用函数,这些名称几乎不可避免地会更长。 这很可能会减少昂贵的前端标记化步骤,因此如果您使用重载操作符的次数过多,则整体编译时间可能实际上会减少。

模板可以有点相同,除了在这种情况下,甚至设想一个合理的比较通常要困难得多。 举个例子,当你在C中进行排序时,你通常使用qsort ,它使用指向函数的指针来处理比较。 C ++中最常见的替代方法是std::sort ,它是一个包含用于比较的模板参数的模板。 不同之处在于,由于这是一个模板参数,因此比较代码通常是内联生成的,而不是通过指针调用。

从理论上讲,我想可以写一个巨大的宏来做同样的事情 - 但我敢肯定,我从来没有见过这样的事情实际完成过,所以很难猜测它可能会更慢或更快如果它存在就使用它。 鉴于宏与模板的简单性,我猜测它会编译得更快,但确切地说,快多少可能永远是一个谜; 我当然不会尝试在C宏中编写完整的Quicksort或Introsort!


模板是在编译时执行的图灵完备函数式语言。 所以他们可以让编译器花费相当长的时间,尽管大多数编译器都有一个递归深度限制,这大大限制了这一点。


模板通常是编译器密集程度更高,部分原因是整个模板库需要编译。 对于STL来说尤其如此,在这种情况下,库的所有代码都在头文件中,并且无论何时编译客户端代码时都需要进行编译。

链接地址: http://www.djcxy.com/p/14981.html

上一篇: Which features of C++ are particularly resource intensive at compile time?

下一篇: How do I find out why g++ takes a very long time on a particular file?