草庐IT

c++ - header 包含优化

coder 2023-05-31 原文

有没有一种自动的方法来优化 C++ 中头文件的包含,从而缩短编译时间? “自动”一词是指工具或程序。是否可以找到哪些头文件已过时(例如未使用公开的功能)?

编辑:让每个包含标题“只包含一次”是一件重要的事情,但是有没有办法甚至更改文件的内容,以便经常使用的“功能”在特定包含上而不是更少经常使用的功能在其他包含上?我要求太多了吗?不幸的是,我们正在谈论一个包含数千个文件的现有代码库。它会是我实际要求的重构工具吗?

谢谢。

最佳答案

更新

我认为您真正想要的是“包含您使用的内容”,而不是一组最小的标题。 IWYU 表示尽可能前向声明,并包含直接声明您使用的符号的 header 。您不能盲目地将文件转换为 IWYU 清洁文件,因为它可能不再编译。发生这种情况时,您需要找到丢失的标题并添加它。但是,如果每个文件都是 IWYU 清洁的,那么您的编译将是 faster overall即使您必须偶尔添加标题。更何况你的标题会更多meaningful/self-documenting .

正如我之前的回答所指出的,在技术上可以包含比 IWYU 所需的更少的标题,但这通常是浪费时间。

现在,如果有一个工具可以为您完成大部分 IWYU 重构工作:)


我曾经考虑过创建/使用这样的工具。这个想法是使用二进制搜索和重复编译来找到最小的包含集。经过进一步调查,它似乎没有那么有用。

一些问题:

  • 更改包含的头文件可以改变行为,并且仍然允许文件编译。特别是一个例子,如果您定义了自己的 std::swap在单独的头文件中。您可以删除该 header ,您的代码仍将使用默认 std::swap 进行编译。执行。但是,std::swap可能是:效率低下,导致运行时错误,或者更糟的是产生微妙的错误逻辑。

  • 有时头文件包含作为文档。例如,使用 std::foreach ,通常包括 <vector>足以让它编译。额外的 #include <algorithm> 代码更有意义.

  • 最小编译集可能无法在编译器或编译器版本之间移植。使用 std::foreach再次举例,不能保证 std::foreach将由 <vector> 提供.

  • 无论如何,最小的包含集可能不会显着影响编译时间。 Visual Studio 和 gcc 支持 #pragma once这使得重复包括基本上不存在的性能明智。并且至少 gcc 的预处理器已经过优化,可以非常快地处理包含守卫(与 #pragma once 一样快)。

关于c++ - header 包含优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1869439/

有关c++ - header 包含优化的更多相关文章

  1. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

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

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

  3. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  4. 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.你能做的最好的事情是:

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

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

  6. ruby-on-rails - 使用包含多个关联和单独的条件 - 2

    我的Gallery模型中有以下查询:media_items.includes(:photo,:video).rank(:position_in_gallery)我的图库模型有_许多媒体项,每个都有一个照片或视频关联。到目前为止,一切正常。它返回所有media_items包括它们的photo或video关联,由media_item的position_in_gallery属性排序。但是我现在需要将此查询返回的照片限制为仅具有is_processing属性的照片,即nil。是否可以进行相同的查询,但条件是返回的照片等同于:.where(photo:'photo.is_processingIS

  7. ruby-on-rails - Heroku 吃掉了我的自定义 HTTP header - 2

    我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份​​验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby​​脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara

  8. ruby - 我怎样才能只写一次 "Text"并同时检查 path_info 是否包含 'A' ? - 2

    -if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc

  9. Ruby,使用包含 TK GUI 的 ocra 部署一个 exe - 2

    Ocra无法处理需要“tk”的应用程序require'tk'puts'nope'用奥克拉http://github.com/larsch/ocra不起作用(如链接中的一个问题所述)问题:https://github.com/larsch/ocra/issues/29(Ocra是1.9的"new"rubyscript2exe,本质上它用于将rb脚本部署为可执行文件)唯一的问题似乎是缺少tcl的DLL文件我不认为这是一个问题据我所知,问题是缺少tk的DLL文件如果它们是已知的,则可以在执行ocra时将它们包括在内有没有办法知道tk工作所需的DLL依赖项? 最佳答

  10. ruby - 允许主机名包含下划线的 URI.parse 的替代方法 - 2

    我正在使用DMOZ的listofurltopics,其中包含一些具有包含下划线的主机名的url。例如:608609TheOuterHeaven610InformationandimagegalleryofMcFarlane'sactionfiguresforTrigun,Akira,TenchiMuyoandotherJapaneseSci-Fianimations.611Top/Arts/Animation/Anime/Collectibles/Models_and_Figures/Action_Figures612虽然此url可以在网络浏览器中使用(或者至少在我的浏览器中可以使用:

随机推荐