草庐IT

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

coder 2024-01-31 原文

我相信 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/

有关c++ - C++ 的哪些特性在编译时特别占用资源?的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  3. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  4. ruby - Sinatra set cache_control to static files in public folder编译错误 - 2

    我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.

  5. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  6. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  7. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  8. ruby-on-rails - 您希望看到哪些 Rails 插件? - 2

    您认为可以作为插件很好地存在于您的Rails应用程序中必须实现的哪些行为?您过去曾搜索过哪些插件功能但找不到?哪些现有的Rails插件可以改进或扩展,如何改进或扩展? 最佳答案 我希望在管理界面中看到一个引擎插件,它提供了应用程序中所有模型的仪表板摘要,以及可配置的事件图表。 关于ruby-on-rails-您希望看到哪些Rails插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio

  9. ruby - Chef LW 资源属性默认值如何引用另一个属性? - 2

    我正在尝试将一个资源属性的默认值设置为另一个属性的值。我正在为我正在构建的tomcat说明书定义一个资源,其中包含以下定义。我想要可以独立设置的“名称”和“服务名称”属性。当未设置服务名称时,我希望它默认为为“名称”提供的任何内容。以下不符合我的预期:attribute:name,:kind_of=>String,:required=>true,:name_attribute=>trueattribute:service_name,:kind_of=>String,:default=>:name注意第二行末尾的“:default=>:name”。当我在Recipe的新block中引用我

  10. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

随机推荐