对于采用 const 结构的函数,编译器不会优化函数体吗?

2024-04-12

我有以下代码:

#include <stdio.h>

typedef struct {
    bool some_var;
} model_t;

const model_t model = {
    true
};

void bla(const model_t *m) {
    if (m->some_var) {
        printf("Some var is true!\n");
    }
    else {
        printf("Some var is false!\n");
    }
}

int main() {
    bla(&model);
}

我想编译器拥有消除所需的所有信息else中的条款bla()功能。调用该函数的唯一代码路径来自 main,并且它接收const model_t,所以它应该能够确定该代码路径没有被使用。然而:

在 GCC 12.2 中,我们看到第二部分被链接进来。

If I inline不过这个功能消失了:

我在这里缺少什么?有什么方法可以让编译器做一些更智能的工作吗?这在 C 和 C++ 中都会发生-O3 and -Os.


编译器does消除内联函数中的 else 路径main。您混淆了无论如何都不会调用的全局函数,并且最终将被链接器丢弃。

如果您使用-f整个程序 https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fwhole-program标志让编译器知道不会链接其他文件,未使用的段将被丢弃:

[在线查看] https://godbolt.org/z/dovas8ePe

此外,您使用static or inline关键字来实现类似的效果。

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

对于采用 const 结构的函数,编译器不会优化函数体吗? 的相关文章

  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • Ruby 中的安全整数解析

    我有一根绳子 比如说 123 我想将它转换为整数123 我知道你可以简单地做some string to i 但这会转换 lolipops to 0 这不是我想要的效果 当我试图用一种美好而痛苦的方式转换一些无效的东西时 我希望它在我脸上爆
  • 格式化 Fitnesse RowFixture 中的数据

    我有一个 Fitnesse RowFixture 它返回业务对象列表 该对象有一个浮点数字段 表示 0 到 1 之间的百分比 consumer业务对象的内容将是来自设计者的网页或报告 因此百分比的格式将由设计者而不是业务对象决定 如果页面能
  • 如何从 tomcat 提供静态内容

    我有一个目录 其中包含许多静态文件 png css 等 我认为 也许是错误的 只需在应用程序的 WEB INF 文件中创建一个目录就足够了 我只需按名称引用这些文件即可访问它们 Ex 我的目录结构如下 WEB INF static styl
  • 在 IntelliJ 中重新排序 Java 类方法的简单方法?

    在 IntelliJ 中 是否有比手动剪切和粘贴代码更简单的方法来重新排序类源文件中的方法 现在我在重构遗留代码时经常需要这个 例如将源代码中的相关方法移至彼此靠近的位置 在 Eclipse AFAIK 中 有一个类似于 IntelliJ
  • 获取gridview中选中记录的超链接字段值

    我的 Gridview 在其列上有一个超链接字段 每行都有复选框 我们可以通过选中复选框来选择任何记录 问题是 我无法获取超链接字段记录 执行此操作的代码是 for int i 0 i lt GridView1 Rows Count i C
  • 调用GAS中的sheet函数

    有没有办法在 google app script 中调用工作表函数 我想调用 MATCH IMPORTRANGE 和 INDEX 函数来计算函数定义中的返回值 如下所示 function abc foo bar a MATCH foo IM
  • 如何从 Azure 媒体服务获取视频的时长?

    我使用 Windows Azure Media Services NET SDK 3 来利用流媒体服务 我想检索视频的持续时间 如何使用 Windows Azure Media Services NET SDK 3 检索视频的持续时间 Az
  • 如何在实时服务器运行的情况下在 Visual Studio Code 中调试 JavaScript

    尝试在 Visual Studio Code 中调试简单的 HTML 和 JavaScript 项目 在 VS Code 终端窗口中 live server 用于启动 index html 在 VS Code 中 安装并配置了 Chrome
  • BitmapSource 转换为 Windows Phone 流

    我有一门课程需要一个流来旋转手机摄像头的图像 我遇到的问题是 当从独立存储加载图片时 即用户之前保存图片之后 它被加载到 BitmapSource 中 如果可能的话 我想将位图源 提取 回流中 有谁知道WP7是否使用silverlight
  • 是否可以使用实例化的 pojo 来插入 JDBC 模板?

    春天有BeanPropertyRowMapper从 SQL 中进行选择并映射到 POJO 对象 而无需创建自定义行映射器 我希望有同样的结果 但有一条插入语句 但我找不到同等的东西 public boolean addRenewalQuot
  • 在 JavaScript 解构中捕获嵌套级别 [重复]

    这个问题在这里已经有答案了 JavaScript 解构是否具有捕获对象及其内容的语法 换句话说 我可以在函数的参数列表中完全执行以下操作而不使用以下内容吗const line f a gt const b a console log I s
  • 使用 cmath 时禁用 math.h 废话[重复]

    这个问题在这里已经有答案了 我以前遇到过一个问题 因为函数在没有调用的情况下就被重载了std 而且诅咒仍然时不时地发生 因为我不使用using namespace std 删除 using namespace std 会导致程序得到垃圾结果
  • Spring使用EntityManager启动多个数据源

    我正在尝试使用 INFOQ 中的本教程设置一个具有多个数据源的 Springboot v2 0 0 BUILD SNAPSHOT 项目 https www infoq com articles Multiple Databases with
  • 为什么在输入中找不到 Ruby 脚本(LoadError)?

    Ruby 由 rbenv 安装 ruby v ruby 1 9 3p327 2012 11 10 revision 37606 i686 linux which ruby home user rbenv shims ruby which s
  • MVC - 部分视图中的字段需要唯一 ID。你怎么做到这一点?

    在我看来 我在循环内渲染部分视图 我遇到的问题是 对于每个新行 字段的 Id 保持不变 我可以更改此设置以使 Id 唯一且可预测吗
  • 如何防止以前部署的工件被覆盖?

    我们使用 Artifactory 作为我们公司的 Maven 存储库 有没有办法对其进行设置 或设置 Maven 以便如果存在具有相同版本号的预先存在的工件 则无法将工件部署到存储库 这样做的原因是为了确保有效的版本不会意外被覆盖 如果某个
  • 如何使textarea的scrollHeight考虑高度重置后由外部滚动条引起的换行

    请参阅编辑以获得实际问题的更好措辞 我正在创建一个文本区域 它会自动适应内容的高度 但是当页面上出现滚动条时它会中断 不是由文本区域本身引起的 文本区域上甚至不能有滚动条 因为我有overflow y hidden 关于第二个例子 Java
  • 如何获取请求的 URL?

    我正在使用 Jeresy Jax RS 构建 Web 服务 现在我需要获取带有端口 的请求的 url 如果存在 所以如果我的服务运行在http www somelocation com web services http www somel
  • Visual Studio 无法调试

    When I press F5 my web application starts up and runs but the Visual Studio debugger is not attached to the process The
  • 对于采用 const 结构的函数,编译器不会优化函数体吗?

    我有以下代码 include