为什么 C# 编译器在 IL 中发出额外的操作码?

2024-03-21

如果我有一个方法Multiply定义为:

public static class Experiment
{
    public static int Multiply(int a, int b)
    {
        return a * b;
    }
}

那么为什么编译器会发出这个IL:

.method public hidebysig static int32 Multiply(int32 a, int32 b) cil managed
{
    .maxstack 2              //why is it not 16?
    .locals init (
        [0] int32 CS$1$0000) //what is this?
    L_0000: nop              //why this?
    L_0001: ldarg.0 
    L_0002: ldarg.1 
    L_0003: mul 
    L_0004: stloc.0          //why this?
    L_0005: br.s L_0007      //why this?
    L_0007: ldloc.0          //why this?
    L_0008: ret 
}

正如您所看到的,它还包含一些对我来说没有意义的附加操作码,而实际上我期望以下 IL:

.method public hidebysig static int32 MyMethod(int32 a, int32 b) cil managed
{
    .maxstack 16
    L_0000: ldarg.0 
    L_0001: ldarg.1 
    L_0002: mul 
    L_0003: ret 
}

它做同样的事情。

所以问题是,为什么编译器会在 IL 中发出额外的操作码?

我正在使用调试模式。


主要用于调试和断点支持;在这里查看答案:为什么这些 nop 指令出现在我的调试版本中? http://blogs.msdn.com/b/zelmalki/archive/2008/12/11/why-is-the-nop-instruction-in-my-debug-build.aspx

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

为什么 C# 编译器在 IL 中发出额外的操作码? 的相关文章

随机推荐

  • Hibernate 的泛型

    Hibernate 无法加载以下类 package com project alice entities import javax persistence Entity import javax persistence GeneratedV
  • 设置对话框的最大高度,然后允许滚动

    我似乎无法理解如何正确设置 jquery ui 对话框的高度 我希望它显示存在的内容的高度 但如果它超过 400 像素 那么我需要一个滚动条 因此 如果内容的高度为 200 像素 则对话框的高度应为 200 像素 如果内容的高度大于 400
  • graphviz 中跨越多行的记录

    我试图用点语言可视化一个相当复杂的结构 因为记录很大 所以我想把代码写成多行 所以而不是 A11 label A 11 Access Control A 11 1 Business requirements for access contr
  • Bash 变量替换和字符串

    假设我有两个变量 a AAA b BBB 我从文件中读取了一个字符串 该字符串如下 str a b 如何从替换变量的第一个字符串创建一个新字符串 newstr AAA BBB bash questions tagged bash多变的间接没
  • 使用 libtorrent-python 下载 Torrent

    我有以下 python 代码 import libtorrent as lt import time ses lt session ses listen on 6881 6891 params save path home download
  • iOS 15 TabView导航栏透明度问题

    新的 iOS 15 使导航栏背景完全透明 如果后面没有元素 如果有一个列表并且您将元素滚动到导航栏后面 这将获得白色半透明背景 但如果我使用 TabView 其中每个 TabItem 都有一个在选项卡项目之间切换时 导航栏背景内的列表未正确
  • 如何在bash中找到字符串中最后分组的数字

    这是一个后续问题this https stackoverflow com q 51923800 10247894问题 关于如何知道字符串中分组数字的数量 In bash 如何找到字符串中最后一次出现的一组数字 所以 如果我有 string
  • Xamarin 表单(跨平台):ListView 中的多种类型的单元格

    I am new to Xamarin I have a requirement where I have to implement a ListView or say tableView that have multiple differ
  • TortoiseGit 使用不正确的 SSH 密钥

    我现在有一个关于乌龟git的奇怪问题 我无法弄清楚 当尝试提交到 github 上的存储库时 出现错误 错误 对 key2 的 martindevans Hermes git 权限被拒绝 Key2 是我用来访问不同 github 存储库的密
  • 我可以一成不变地借用 self 来实现 self.callbacks: Vec> 吗?

    pub struct Notifier lt a T gt callbacks Vec
  • 如果启用了热模块替换,为什么在更改 HTML 时 LiveReload 在 Webpack 中不起作用?

    如果你设置hot true in the devServer设置在Webpack 那么模块热更换CSS 有效 并且无需重新加载完整页面即可应用更改 但是当改变HTML文件时 实时重载由于某种原因不起作用 您需要手动刷新页面才能应用更改 If
  • 'Object.ReferenceEquals' 始终为 false,因为它是使用值类型调用的

    当我使用slSvcUtil exe要创建我的服务客户端文件 我看到如下代码 private string CategoryField System Runtime Serialization DataMemberAttribute publ
  • 如何使用 Python 中的 DLL 文件?

    最简单的使用方法是什么DLL从内部归档Python 具体来说 如何做到这一点without编写任何附加包装器C 向其公开功能的代码Python Native Python与使用第三方库相比 功能更受青睐 为了方便使用 ctypes http
  • 如何解决 CoUnitialize() 上挂起的进程?

    我有一个本机 Visual C NT 服务 当服务启动时 它的线程调用CoInitialize 它将线程附加到 STA 服务线程通过 COM 接口使用 MSXML 当服务接收到SERVICE CONTROL STOP它在消息队列中发布一条消
  • 创建图像蒙版

    用户向我的应用程序提供了一张图像 应用程序需要从中制作一个遮罩 对于原始图像中的每个透明像素 蒙版都包含一个红色像素 我尝试了以下方法 Bitmap OrgImg Image FromFile FilePath Bitmap NewImg
  • 自定义添加到购物车按钮,将多个产品添加到购物车并添加数量:woocommerce

    我想创建自定义 添加到购物车 按钮 将我的 3 个产品添加到购物车 每个产品 2 个数量 为了将三个产品添加到购物车中 我已经使用了这样的方法 a class single add to cart button shop skin btn
  • 如何创建部分发票?

    我想从特定订单中为该订单中的某些选定项目创建发票 我已以编程方式成功为整个订单创建了发票 但我想创建该订单的部分发票 最后我明白了 必须挖 magento 才能得到这个 orderid order id order Mage getMode
  • 使用 asciidoctor 创建自定义 HTML

    我正在使用 CMS 来发布我的博客文章 我正在寻找一种从简单的文本文件离线创建 HTML 文章的方法 这是我通常在文章中使用的一段 HTML p We want to show how you can gather information
  • Spring Boot + 云 | Zuul代理 |集成测试

    当使用 Spring Boot 构建微服务时 可以非常轻松地编写大量且非常易读的集成测试并模拟远程服务请求MockRestServiceServer 有没有办法使用类似的方法来执行额外的集成测试ZuulProxy 我想要实现的是能够模拟远程
  • 为什么 C# 编译器在 IL 中发出额外的操作码?

    如果我有一个方法Multiply定义为 public static class Experiment public static int Multiply int a int b return a b 那么为什么编译器会发出这个IL met