对于采用 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 结构的函数,编译器不会优化函数体吗? 的相关文章

  • json.net自定义jobject反序列化

    我正在尝试使用 JsonConvert DeserializeObject string 将字符串反序列化为可与动态一起使用的 jobject 来动态访问 json 文档 但是我想避免知道文档的大小写 以便我可以输入 dynamic doc
  • 将 new 与 decltype 一起使用

    T t T is an implementation detail t new T want to avoid naming T to allow for flexibility t new decltype t error cannot
  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • std::call_once 可重入且线程安全吗?

    std call once http en cppreference com w cpp thread call once是线程安全的 但它也是可重入的吗 我使用 VS2012 调试和发布 进行的测试表明 调用std call once从单
  • 增强精神、递归和堆栈溢出

    为什么下面的代码在运行时崩溃 它会给出堆栈溢出错误 include
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • C++ 中 void(*)() 和 void(&)() 之间的区别[重复]

    这个问题在这里已经有答案了 在此示例代码中 func1是类型void int double and funky是类型void int double include
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • 来自 3rd 方库的链接器错误 LNK2019

    我正在将旧的 vc 6 0 应用程序移植到 vs2005 我收到以下链接器错误 我花了几天时间试图找到解决方案 错误LNK2019 无法解析的外部符号 imp 创建AwnService 52 在函数 public int thiscall
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne

随机推荐

  • 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