GCC LTO 是否执行跨文件死代码消除?

2023-12-01

说我有一个函数

void do_something() {
    //....
    #ifdef FEATURE_X
        feature_x();
    #endif
    //....
}

我可以毫无问题地编译和运行它;如果我想要这个功能我可以通过-D FEATURE_X它有效。

但是,如果我想把do_something到另一个文件中(并且每次我决定更改选项时都不必重新编译该文件)。如果它在同一个文件中,我认为

const int FEATURE_X=0;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

将正确使用死代码消除,消除调用。如果我把它放在另一个文件中,没有 LTO,

extern const int FEATURE_X;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

它不会删除代码(它无法知道)。因此,在启用链接时间优化的情况下,编译器可以检测到FEATURE_X在链接时,确定代码是否被使用,如果合适则将其删除?


GCC确实删除了跨模块不可达函数,但它无法确定您最后一个测试用例中的代码是否已死,因为FEATURE_X的常量值确定得太晚了。

如果您将使用 -D 方式或将您的const int FEATURE_X=0;进入每个模块然后是的,代码将被消除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC LTO 是否执行跨文件死代码消除? 的相关文章

随机推荐

  • Linq to SQL - “此成员被定义多次”错误

    我有以下 linq 代码 CMSDataContext dc new CMSDataContext var q from u in dc CMSUsers join d in dc tblDistricts on u DistrictCod
  • 使用 Unity 的 Visual Studio 安装问题

    因此 我尝试加载 Visual Studio 来编写一些用于鼠标移动的代码 但出现以下错误 此 Visual Studio 安装的设置尚未完成 请再次运行 Visual Studio 安装程序 我已经尝试安装所有内容 但它不起作用 我在互联
  • 在 C# 中对 TreeViewItems 列表进行数字排序

    这个问题是后续问题this问题 我目前的总体目标是添加到我的程序中TreeViewItem my TreeViewItem有在运行时添加的子节点 根据输入的值按数字升序排列header 我收到了一个答案ModelView 一个我不太熟悉的工
  • iText 5:创建包含 2 种背景颜色且文本重叠的 PdfPcell

    在 java 中使用 iText5 并希望对 PdfPcell 的结果进行颜色编码 如下所示 例如 该表包括2列和3行 有人知道如何实现这一目标吗 我可以简单地使用设置背景颜色吗 PdfPCell cell new PdfPCell new
  • 如何使用exceljs将excelsheet行高设置为auto,以便内容可以自动适应单元格

    我在用exceljsnpm 将数据导出到 Excelsheet 中 由于单元格中的内容很大 因此我希望文本包含在单元格中 并且应该有足够的高度来显示完整内容 我尝试给出固定宽度 worksheet getRow 1 height 20 固定
  • 将子字符串与字符串匹配

    我在将子字符串与字符串匹配时遇到问题 我的子字符串和字符串是这样的 var str My name is foo I have bag s var substr I have bag s 现在当我使用字符串匹配 子字符串 它返回 null
  • MAC OS:警告:项目错误:QT 中的未知模块:webkitwidgets

    我正在尝试构建 notepadqqMacOS遵循官方文档 运行 make 命令时我面临以下问题 make cd src ui test e Makefile usr local Cellar qt 6 3 0 bin qmake o Mak
  • 如何清除Flutter的Build缓存?

    flutter 的构建似乎有问题 我总是需要表现RUN gt 颤振全面重启每次我在模拟器或设备上运行应用程序时 否则 应用程序会加载一个脚手架主体 这是我两周前第一次开始编码时的代码 这是pastebin上的当前来源 children
  • 使用 < 重定向命令输入

    输入重定向适用于 exe 文件或内部 Windows 命令 app exe lt ListOfNames txt sort lt input txt 但是 当我尝试将其重定向到批处理脚本时 它不起作用 测试 bat echo off ech
  • 批处理文件运行时 cmd 中出现奇怪的输出

    我在批处理文件中有该脚本 cd C TESTS front tests call git pull cd C TEST front tests AutoApp bin debug start AutoApp exe And git pull
  • 使用rhandsontable R包生成的表时如何实现shinyStore?

    我正在尝试实现帖子中答案中的 保存 功能如何在 R Shiny 中使用 DT 的 localStorage 选项 进入我用 rhandsontable 渲染的表 但它不起作用 那篇文章涉及表包 DT 而我正在使用 rhandsontable
  • 如何用数学方法缩短网址

    我正在研究使用算法缩短 加密长度为 150 到 250 个字符到最多 12 个字符的 url 的可能性 最初我怀疑这是否可能 但我想利用 StackOverflow 的伟大思想 该算法应该是可以用经典的 asp sql c vb foxpr
  • 如何在android模拟器中运行特定的活动?

    我已经在 Eclipse 中创建了 4 个活动 现在我想在模拟器中分别一一运行活动 1 2 3 4 进行测试 谁能指导我如何运行所有这些 当我按下运行按钮时 它只运行第一个活动 任何帮助 将不胜感激 您可以尝试 startActivityF
  • 无法从 BASH 中的 WHILE 中获取变量的值

    我有一个代码 od An t x1 lt file while read line do for char in line do if needspace eq 0 then export hexs hexs printf 2s char
  • 如何移动放置在容器底部的最小化组件?

    我的容器中有三个组件 其中有按钮 当我点击最小化按钮时 组件会最小化到容器的底部 当我点击最小化组件时 它会最大化 假设三个组件位于底部 如果我最大化第二个组件 那么它就会最大化 而第三个最小化组件不会占据第二个组件的位置 并且这仍然是空间
  • 如何在 Code::blocks 中使用自定义项目模板

    在 MS Visual studio 中 我可以制作自己的项目 然后将其保存为自定义模板以供下次使用 有谁知道如何在代码块中做到这一点 一张图片胜过千言万语 https i stack imgur com BX5lM png
  • Raspberry pi 与 pygame.mixer 音频仅产生静态

    我对树莓派很陌生 而且很新 但我试图通过 pi B 上的 python 文件播放音频文件 我使用 omxplayer 从命令行播放音频 它工作正常 但是当我运行以下命令时它仅播放静态代码 from pygame import mixer m
  • 在Java中表示卡片的类?

    我正在用 Java 编写一个二十一点程序 并且开始为对象 Card 编写类声明 这足够了 还是有一些我应该掩盖的方法 public class Card public int suit Value 1 4 to represent suit
  • 如何使用锁定提示以便两个并行查询返回不相交的结果?

    我有一个 SQL 表Tasks有柱子Id and State 我需要执行以下操作 找到任何一项具有状态的任务ReadyForProcessing 检索其所有列并将其状态设置为Processing 类似于 伪代码 BEGIN TRANSACT
  • GCC LTO 是否执行跨文件死代码消除?

    说我有一个函数 void do something ifdef FEATURE X feature x endif 我可以毫无问题地编译和运行它 如果我想要这个功能我可以通过 D FEATURE X它有效 但是 如果我想把do someth