gpt4 book ai didi

c - 为什么编译器不优化掉中断代码?

转载 作者:太空宇宙 更新时间:2023-11-04 01:05:06 25 4
gpt4 key购买 nike

我最近遇到了一个问题,变量只在中断处理程序中被修改。变量本身没有声明为 volatile,因此在更高级别的优化下,编译器破坏了代码。但是,编译器足够聪明,可以编译中断代码,因为中断仍然会触发。

所以这是我的问题:

  1. 如果编译器足够聪明,可以编译中断代码,为什么它不够聪明,无法意识到变量在中断内部被更改?

  2. 在更高级别的优化中,未调用的函数会被优化掉。由于没有代码调用中断处理程序,因此应该对其进行优化。是什么导致编译器仍然编译中断代码?

最佳答案

  1. 语言执行模型表明普通(非 volatile )变量不能被“外力”改变。 IE。如果您的代码流没有显式更改变量,那么从该代码流的角度来看,该变量不可能更改。 (除了 C11 为多线程执行定义的内容之外)。您必须手动“指定”可由中断处理程序更改的变量。

    这是实现 C 代码高效优化的主要因素之一。如果不对 C 程序的性能产生重大负面影响,就无法消除它。

  2. 首先,编译器通常不会优化带有外部链接的函数。您的中断处理程序是否使用外部链接声明?

    其次,优化或保留函数的决定并不是真正基于函数是否被调用。它基于相应的符号是否以任何方式在您的程序中被引用。删除未引用的符号,而保留引用的符号。除了调用函数符号之外,还有其他方法可以引用函数符号。例如,获取函数的地址也算作对函数符号的引用。地址在程序中任意位置的函数永远不会被优化掉。

    您的中断 vector 条目在程序启动时以某种方式初始化,这通常涉及获取处理函数的地址。这已经足以保护此功能不被优化。

关于c - 为什么编译器不优化掉中断代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25576812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com