C++的哪些特性在编译时特别是资源密集型?

mou*_*sey 6 c c++

我相信C编译通常比C++更快,因为它缺乏后期绑定和运算符重载等功能.我很想知道C++的哪些特性往往会减慢编译过程的速度?

Jer*_*fin 7

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

在问题中提及后期绑定是一个很好的例子:编译C++虚函数几乎肯定比编译C(非虚)函数慢一些.这并不意味着 - 这两者根本不相同.C++虚函数的C等价物通常是指向函数的指针,或者是使用枚举类型上的开关来确定要调用的多个代码段中的哪一个的代码.

当你创建实际等效的代码时,C是否会有任何优势是值得怀疑的.事实上,我的猜测恰恰相反:至少在我编写的编译器中,花费了很多时间在前端,做了相对简单的事情,比如只是标记输入流.考虑到C中代码所需的额外长度,当你拥有实际等效的代码时,如果编译结果大致相同甚至更慢,那么我不会感到惊讶.

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

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

从理论上讲,我想也许可以编写一个巨大的宏来做同样的事情 - 但我很确定我从来没有见过这样的事情真的完成了,所以很难猜到它可能会变慢多少或者更快.使用,如果它存在.鉴于宏与模板的简单性,我猜它编译得更快,但究竟多少可能永远是一个谜.肯定不会尝试在C宏中编写完整的Quicksort或Introsort!


Omn*_*ous 5

模板是一种完整的功能语言,在编译时执行.所以它们可能会导致编译器花费很长时间,尽管大多数编译器都有一个强烈限制它的递归深度限制.

  • 实际上,我相信递归深度限制是唯一可能使编译器终止于某些输入的东西! (3认同)
  • 事实上,我认为模板是编译时唯一真正改变的东西.C++的所有其他功能导致实际使用*的代码,如果你想在C中使用相同的功能,你必须自己生成以进行公平的比较.模板(特别是递归)显然是一种将计算委托给编译器的功能.编译时间可以变得非常浪漫. (2认同)