gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:48 24 4
gpt4 key购买 nike

我相信 C 的编译速度通常比 C++ 快,因为它缺少后期绑定(bind)和运算符重载等功能。我很想知道 C++ 的哪些特性最容易减慢编译过程?

最佳答案

这是一个很难以有意义的方式回答的问题。如果您纯粹查看每秒的代码行数(或按此顺序计算的某些内容),毫无疑问 C 编译器应该比 C++ 编译器更快。就其本身而言,这并不意味着什么。

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

当您创建实际上等效的代码时,C 是否有任何优势是值得商榷的。事实上,我的猜测恰恰相反:至少在我编写的编译器中,大量时间花费在前端,做一些相对简单的事情,比如对输入流进行标记。考虑到我对 C 中这样的代码期望的额外长度,当您拥有实际上等效的代码时,如果它最终大致相同或编译甚至有点慢。

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

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

理论上我想人们也许可以写一个巨大的宏来做同样的事情——但我敢肯定我从来没有见过这样的事情真的发生过,所以很难猜测它会慢多少或快多少如果它存在的话可能会被使用。考虑到宏相对于模板的简单性,我猜想它编译得更快,但到底快多少可能永远是个谜; 当然不会尝试在 C 宏中编写完整的快速排序或 Introsort!

关于c++ - C++ 的哪些特性在编译时特别占用资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3286572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com