首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么编译器不优化中断代码?

为什么编译器不优化中断代码?
EN

Stack Overflow用户
提问于 2014-08-29 21:59:02
回答 1查看 1.1K关注 0票数 1

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

以下是我的问题:

  1. 如果编译器足够聪明,可以编译中断代码,那么为什么它不够聪明,不能意识到在中断中变量是被改变的呢?
  2. 在更高的优化级别上,不被称为优化的函数会被优化掉。由于没有代码调用中断处理程序,所以应该对其进行优化。究竟是什么原因导致编译器编译中断代码?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-29 22:04:35

  1. 语言执行模型指出,普通(非易失性)变量不能被“外部力量”所改变。也就是说,如果您的代码流没有显式地更改变量,那么从该代码流的角度来看,变量不可能更改。(此外,C11为多线程执行定义了什么)。您必须手动“指定”可由中断处理程序更改的变量。 这是实现C代码高效优化的主要因素之一。如果不对C程序的性能产生显著的负面影响,就无法消除它。
  2. 首先,编译器通常不会通过外部链接来优化函数。您的中断处理程序是否使用外部链接声明? 其次,优化或保留函数的决定实际上不是基于函数是否被调用而做出的。它基于是否在程序中以任何方式引用相应的符号。非引用符号被移除,而引用符号被保留.除了调用函数符号之外,还有其他方法来引用它。例如,函数的地址也算作对函数符号的引用。其地址被取在程序中任何位置的函数都不会被优化。 中断向量条目在程序启动时会以某种方式被初始化,这通常涉及到接收处理程序函数的地址。这已经足够保护这个函数不被优化了。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25576812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档