`
RednaxelaFX
  • 浏览: 3047988 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

nop对程序语义的影响

    博客分类:
  • C#
阅读更多
原本我一直以为nop对程序语义应该没什么影响的,呜,我错了。

之前一直觉得很奇怪,为什么不开/o(/optimize,优化)开关来编译C#程序的话,生成的IL代码里会有很多nop。后来才知道那些nop是在一些语句或者表达式片段的边界放的,目的是为了提供更好的调试体验:有些代码被编译之后可能会变得比较难下断点,所以插入nop来占位,使得原本难下断点的地方能被设置断点。

但是插入nop的代价不只是使程序的运行速度降低;更糟糕的是,它可能会改变程序的语义使本来应该正常的程序变得无法正确运行。
Eric Lippert在去年的一篇blog里提到了这点。他举的例子是C#里的lock语句:
lock(expression) statement

会被编译成类似这样:
temp = expression;
System.Threading.Monitor.Enter(temp); 
try { statement } finally { System.Threading.Monitor.Exit(temp); }

这本来没什么问题,但是当C#编译器在Enter()与try之间插入nop时问题就来了:如果另外一个线程在当前线程刚获取锁在nop的时候引发了线程终止异常,那么finally子句就永远不会被执行,于是就是……死锁。

据说这个问题在C# 3.0里也没解决。不过还好遇到这种问题的可能性很小。
Hmm。果然遇上多线程之后很多“常识”都得重新想想。
分享到:
评论
1 楼 lwwin 2008-06-05  
这个……其实还没有明白NOP的问题……
断点恢复和NOP没啥关系罢??

相关推荐

    nop.rar_nop_nop键盘

    NOP指令在程序设计中有着重要的作用,尤其是在调试、延迟、对齐代码或填充空间时。 描述中提到的“延时和键盘显示功能”是指通过NOP指令来实现程序的延时效果,并且可能涉及到键盘输入的处理和显示。在实际编程中,...

    Ollydbg篇NOP位移法

    以下是对"Ollydbg篇NOP位移法"这一主题的详细说明。 **什么是NOP指令?** NOP(No Operation)是汇编语言中的一种指令,它在执行时不做任何操作,通常用作填充空间或调整指令地址。在16位x86架构下,NOP指令通常...

    nop19中文包nop19中文包nop19中文包nop19中文包

    标题中的“nop19中文包”多次重复,可能是指一个针对NOP19编程语言或框架的中文资源包。NOP19可能是一个特定的版本或者一个专门为学习或开发目的设计的工具。由于信息有限,我们首先假设这是一个编程环境或库的中文...

    1个NOP延时多上时间,怎么计算?

    此外,使用NOP指令进行延时会占用宝贵的CPU资源,如果需要执行其他任务,则可能会影响程序的响应速度和效率。在现代的嵌入式程序设计中,往往会使用定时器/计数器、中断、以及外围硬件提供的定时功能来实现更为精确...

    单片机C51中的NOP指令使用经验

    作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。对于延时比较长的,要求在大于10us,采用...

    单片机C语言中nop函数使用及延时计算.pdf

    "单片机C语言中nop函数使用及延时计算" 单片机C语言中nop函数使用及延时计算是指在单片机C语言编程中使用nop函数来产生短延时的效果。nop函数相当于汇编语言中的NOP指令,延时几微秒。NOP指令为单周期指令,可以由...

    单片机C语言中_nop_函数使用及延时计算

    单片机C语言中_nop_函数使用及延时计算 单片机C语言中_nop_函数使用是指在单片机的C语言编程中使用_nop_函数来产生短延时的效果。标准的C语言中没有空语句,但是在单片机的C语言编程中,经常需要用几个空指令产生短...

    基于Javascript的Nop平台低代码前端设计源码

    Nop平台低代码前端设计源码:该项目基于Javascript开发,包含1549个文件,主要使用TypeScript、...nop-chaos是Nop平台的前端部分,采用了Vue3.0、ant-design-vue、百度AMIS、logicflow、xspreadsheet等技术实现。

    单片机c语言中nop函数的使用方法和延时计算.pdf

    "单片机c语言中nop函数的使用方法和延时计算" 单片机C语言中NOP函数的使用方法和延时计算是单片机编程中非常重要的一个方面。NOP函数是一个空指令,它不执行任何操作,但可以产生短延时的效果。在Keil C51中,可以...

    slf4j-nop-1.5.8-sources.jar.zip

    总结来说,"slf4j-nop-1.5.8-sources.jar.zip" 提供的是SLF4J NOP绑定的源代码,适用于不需要日志记录或者对性能有极致追求的场景。了解并使用SLF4J可以帮助开发者创建更加灵活、可维护的项目,并能轻松地调整日志...

    nop多语言电子商城系统

    国外的一个高质量的开源b2c网站系统,基于EntityFramework4.0和MVC3.0,使用Razor模板引擎,有很强的插件机制,包括支付配送功能都是通过插件来实现的,基于...综合能力远远高于国内的一些程序架构糟糕的.net商城程序

    NOP的作用,巧用nop

    小小nop有何作用?可以延时,等待清空缓存位,清除flag位……

    slf4j-nop-1.5.11.jar

    hibernate 3.5必需包。。 The slf4j NOP binding

    slf4j-nop-1.6.rar_slf4j-nop_slf4j-nop-_slf4j-nop-1.6_slf4j-nop-1

    3. **性能优化**:在不需要日志的地方,SLF4J-NOP避免了执行日志记录方法的开销,有助于提高应用程序的性能。 在实际项目中,通常会在开发和测试阶段使用更详细的日志实现,如Logback或Log4j,以便于调试和问题追踪...

    NOP开源项目

    NOP开源项目是一个基于C#开发的电子商务平台,它为在线商家提供了一套全面的解决方案,集成了购物车、订单管理、库存控制、客户关系管理等多个关键功能。该项目以开源、免费的形式提供,允许开发者根据自身需求进行...

    单片机c语言中nop函数的使用方法和延时计算

    标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。  这在汇编语言中很容易实现,写几个nop就行了。

    slf4j-nop-1.7.30.jar

    slf4j-nop-1.7.30,开发的时候找了好久,好东西当然需要分享,希望大家能喜欢!!!good

    安川机器人-程序示例.doc

    1 NOP 程序起始命令(空指令) 2 *cycle 注释:循环运行 3 MOVJ C00000 VJ=100.00 point :距对中台大概150mm的位置 4 PULSE OT#(68) T=0.50 RB时间测量point11 (取出待机位置) 5 *Loop1 abel:Loop1 6 ...

    tm1812程序实例

    ### TM1812程序实例解析 #### 一、概述 本篇文章将深入解析一个基于51单片机实现的TM1812驱动程序实例。该实例代码展示了如何通过控制信号来驱动TM1812 LED显示模块,并实现动态显示效果。TM1812是一种用于控制LED...

    slf4j-nop-1.5.2.jar

    "slf4j-nop-1.5.2.jar"是SLF4J的一个特定实现,称为"No Operation"或NOP logger。这个实现实际上不做任何日志记录,只是简单地忽略所有的日志请求,适用于那些不需要日志功能或者希望最小化运行时依赖的应用。 在...

Global site tag (gtag.js) - Google Analytics