“ceq”MSIL 命令和 object.InternalEquals 之间的区别

2023-12-19

我在 ILDASM 和 Reflector 中进行了深入研究,发现:

  1. == 被编译为“ceq”MSIL 命令
  2. object.Equals 保持原样
  3. object.Equals 调用 对象.InternalEquals

This https://stackoverflow.com/questions/384294/where-is-the-implementation-of-internalequalsobject-obja-object-objb问题向我展示了如何找出如何实现InternalEquals,即在.cpp类(或CLR中的某个地方)中。

我的问题是:

ceq 变成了什么?不同 .cpp 类中的另一种方法? IE。它们是完全不同的代码?那么,虽然 == 和 Equals 的默认行为看起来是相同的,但它是不同的代码?


== 运算符并不总是被翻译为 ceq。类型可以使用运算符 ==() 重载它。例如,System.Decimal 就是这样做的,它会重载所有运算符,因为它们的实现很重要,并且抖动没有类型的特殊知识(编译器有)。

您将通过 Reflector 作为 Decimal.op_Equality() 方法找到它。这会将您引向 FCallCompare,这是一个归属于 MethodImplOptions.InternalCall 的方法。这些方法很特殊,抖动对它们有秘密了解。您可以通过Rotor中的clr/src/vm/ecall.cpp源代码文件找到它们的实现。它包含所有内部调用函数的表,抖动通过方法名称查找表项。然后将表中对应的C++函数的地址编译成call指令。请注意,自 Rotor 发布以来函数名称已更改,搜索 FCallAdd,它是表中的下一个条目。这将带您进入 COMDecimal::Compare。这将带您进入 comdecimal.cpp 源代码文件。

x86 和 x64 jitter 知道如何直接将 ceq 操作码转换为机器代码,而不需要辅助函数,它会内联生成本机机器指令。实际生成的代码取决于所比较的值的类型。而目标,x64抖动使用SSE指令,x86使用FPU指令来比较浮点值。当然,其他的不安也会以不同的方式实现它们。

像 Object.InternalEquals() 这样的辅助函数也是一个内部方法,就像 FCallCompare 一样。您可以使用相同的策略来找到实现。

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

“ceq”MSIL 命令和 object.InternalEquals 之间的区别 的相关文章

  • C#中如何检测字符串是否为货币

    通常当我需要转换时currency string 如 1200 55 z 或 1 249 到十进制值我这样做 if currencyString Contains z decimal value Decimal Parse dataToCh
  • 如何自定义 DataTable 列的排序

    我需要对数据表列的值进行排序 该列包含字符串 整数或混合文本 例如 数据表列包含如下值 23 18 12 store 23 store a1 1283 25 如果我使用对值进行排序Dataview sort 方法会按此顺序产生 12 128
  • Web UI 中的 .Result 出现死锁

    我正在阅读以下主题http blog stephencleary com 2012 07 dont block on async code html http blog stephencleary com 2012 07 dont bloc
  • 如何从当前 .NET 表单/应用程序发送密钥 F12

    我非常确定以下按钮激活的表单代码应该在我的 C 应用程序中引发 Control F12 SendKeys F12 但它似乎并没有继续进入 Windows shell 并激活另一个正在侦听它的程序 我的键盘可以用 看起来发送键在某处被拦截 并
  • 测试 hdf5/c++ 中的组是否存在

    我正在打开一个现有的 HDF5 文件来附加数据 我想向那个叫做的小组保证 A存在以供后续访问 我正在寻找一种简单的方法来创建 A有条件地 如果不存在则创建并返回新组 或者返回现有组 一种方法是测试 A存在 我怎样才能高效地做到这一点 根据
  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • 使用 C# 使用应用程序密码登录 Office 365 SMTP

    在我们的 Office 365 公司帐户中实施两步身份验证之前 我的 C WPF 程序已成功进行身份验证并发送邮件 我使用了 SmtpClient 库 但现在我必须找到另一个解决方案 因为它不再起作用 我找不到任何使用 O365 应用程序密
  • 浮点提升:stroustrup vs 编译器 - 谁是对的?

    在 Stroustrup 的新书 C 编程语言 第四版 第 10 5 1 节中 他说 在执行算术运算之前 整数提升用于从较短的整数类型创建整数 类似地 浮点提升是用于从浮点数创建双精度数 我用以下代码确认了第一个声明 include
  • C++ 在 Vector 中使用不可分配的对象

    我想将对象列表存储在std vector 但对象包含引用且无法分配给 但是 我可以复制构造该对象 我能想到的唯一选择是使用指针来包装对象并在需要分配指针时重新设置指针 但这样做的语法会显着降低可读性 特别是在使用迭代器时 我更喜欢另一种选择
  • 组合 Datepicker 和 Timepicker 值 Win 8.1

    我试图同时使用 Datepicker Timepicker 来返回可以存储在数据库中的 DateTime 例如 我想要安排会议的开始日期和结束日期 如果适用 我将如何将这些值组合成 SQL 数据库可以处理的正确格式 任何反馈都会很棒 我让这
  • 通过 mpi 发送 c++ std::vector

    我知道存储一个std vector
  • 如何在不使用reinterpret_cast的情况下使用dlsym()加载函数?

    我正在尝试使用 clang tidy 来强制执行 C 核心指南 虽然它确实有很多有效点 但有一件事我无法真正解决 dlsym 返回一个void 我需要以某种方式将其转换为正确的函数指针 为此 我使用reinterpret cast 由于指南
  • _mm_max_ss 在 clang 和 gcc 之间有不同的行为

    我正在尝试使用 clang 和 gcc 交叉编译一个项目 但在使用时发现一些奇怪的差异 mm max ss e g m128 a mm set ss std numeric limits
  • 在生产者-消费者情况下使用条件变量

    我正在尝试了解条件变量以及如何在生产者 消费者情况下使用它 我有一个队列 其中一个线程将数字推入队列 而另一个线程从队列中弹出数字 当生产线程放置一些数据时 我想使用条件变量向消费线程发出信号 问题是有时 或大多数时候 它只将最多两个项目推
  • 在可观察项目生成时对其进行处理

    我有一个IObservable它会生成一次性物品 并且在其生命周期内可能会生成无限数量的物品 因此 我想在每次生成新项目时处理最后一个项目 因此Using http reactivex io documentation operators
  • C# ToString("MM/dd/yy") 删除前导 0 [重复]

    这个问题在这里已经有答案了 可能的重复 格式化 NET DateTime Day 不带前导零 https stackoverflow com questions 988353 format net datetime day with no
  • 通过 MSBuild 调用 cl.exe 时无限期挂起

    我正在尝试在我的 主要是 C 项目上运行 MSBuild 想象一下一个非常庞大的代码库 Visual Studio 2015 是有问题的工具集 Windows 7 SP1 和 VS 2015 更新 2 即使使用 m 1 从而迫使它仅使用一个
  • 有没有办法让 VS2010 在我的方法中扩展或收缩 try 块?

    我的代码有很多 try catch finally 块 与我在 VS2010 中的方法不同 除了添加区域之外 我无法在开发时扩展或收缩这些区域来隐藏内容 try vm R vm Qu vm T vm D vm Fil vm Type vm
  • 如何仅更改 DateTime 的日期部分,同时保留时间部分?

    我在代码中使用了很多 DateTime 我想将这些日期时间更改为我的特定日期并保留 时间 1 2012 02 02 06 00 00 gt 2015 12 12 06 00 00 2 2013 02 02 12 00 00 gt 2015
  • ASP.NET Core:会话 ID 始终变化

    今天启动了一个全新的 ASP NET Core 网站 按照说明添加会话 我们在索引页上打印出会话 ID 它始终是唯一的 我认为这可能是 cookie 合规性 所以我在 Chrome 的高级设置和调试器中删除了所有 cookie 但横幅不会再

随机推荐

  • 如何在javascript中检查图像是否是损坏的图像

    我从 Twitter 获取个人资料图像并将图像 URL 存储在我的数据库中 某些网址给出了损坏的图像 其中网址以图像扩展名结尾 任何人都可以帮助我检查图像是有效图像还是损坏的图像 如果存在损坏的图像 我需要显示默认图像 var image
  • NSSearchPathForDirectoriesInDomains 和持久数据的问题

    根据建议 我们使用以下代码来检索用户文档的路径 NSArray paths NSSearchPathForDirectoriesInDomains NSDocumentDirectory NSUserDomainMask YES NSStr
  • 如何在页面对象模式中使用 WebDriver / Selenium 2 加载组件?

    我很难适应 WebDriver 页面对象模式 请分享您使用页面对象模式和可加载组件的经验和方法 由于 PageObject 通常代表一个组件或一项功能 因此我首先想到应该使用它在 load 中实际执行一些操作 并查看它是否执行 isLoad
  • Java:通用函数X->Y接口

    我需要一个像这样的界面 interface Function
  • 如何在不打开摄像机的情况下录制视频?

    如何在不打开任何相机的情况下录制视频 我的要求是 当一个人遇到问题时 他的视频会被记录下来 但不是通过打开摄像头 它应该在后台工作 Thanks Use AV基础框架 http developer apple com library ios
  • 按特定字形划分字体子集

    我有一个 14MB 的 TTF 其中大部分是简体中文字符 我想通过创建一个仅包含 HTML 页面中特定字符的子集来减小大小 因此 理想情况下 我想向 Linux 程序传递一段文本 并让它根据包含的字符重新创建字体 E g magic fon
  • 为什么按值返回列表初始化对象时不调用复制构造函数?

    据我了解 当从函数按值返回对象时 会调用它们的复制构造函数 如果类具有已删除的复制构造函数 则按值返回将失败 struct X X const X delete X f return X error call to deleted cons
  • 有人看到我的港口号的正则有什么问题吗?

    我为端口号做了一条正则 在您说这是一个坏主意之前 它都会陷入更大的url正则义务 这比听起来要难得多 我的同事说这真的很糟糕 不会抓住一切 我不同意 我相信这个东西可以捕获从 0 到 65535 的所有内容没有其他的 我正在寻找对此的确认
  • 确保“重新启动”任务在其之前自动运行:测试

    是否有可能获得re start 又名重新启动 任务在运行 IntegrationTest 目标之前自动运行 it test 我以为这样就可以了 test lt lt test in IntegrationTest dependsOn reS
  • 如何在android中实现均衡器

    我必须在 android 中实现均衡器 我还发现源代码在这里 http kevinboone net android simple eq html 但我不知道 NumberOfBands 和 BandLevelRange 它们是什么 以及如
  • 临时更改 perl 系统调用中的默认 shell

    情况是这样的 在 Perl 中 我运行这个 my stat system cd somewhere source somescript bash do something else 对于我的所有用户 除了一名用户 来说 这都不是问题 但对于
  • .NET Framework 的目标版本与启动条件不匹配

    我有一个在 VS 2010 中构建的 C 项目 它通过 COM 引用 C 项目 这也是解决方案的一部分 上周五 我成功构建了一个版本 更改了一行代码 又进行了另一个构建 然后我开始收到有关 NET 的错误 项目中 NET Framework
  • 子例程中的默认参数值

    我不知道如何设置子例程的默认参数 这是我的考虑 sub hello print Hello world 如果您只需要一个参数 那么这很有效 如何为多个参数设置默认值 我本来打算这样做 sub hello my say 0 Hello my
  • 如何在 Java 中从内存中“清零”AES SecretKeySpec 密钥

    我正在使用 Java AES 加密 SecretKeySpec byte key String algorithm 生成一个Key对象 加密某些内容后 我想从内存中删除密钥 我可以删除对密钥的所有引用 但这并不能保证密钥不会浮动在内存中的某
  • 模型中默认范围内的参数

    我正在使用 Devise 来验证用户身份 我需要在所有表中显示 隐藏基于 global location id 列的数据 当前global location id的值将来自current user global location id 我尝
  • 使用 Azure BrokeredMessage 在不知道类型的情况下获取正文

    当您在 Azure 服务总线中使用中转消息时 可以通过调用 GetBody 检索消息正文 代码很简单 var msg subscription Receive MyPayload payload msg GetBody
  • 使用Spring JDBC的PreparedStatementCreator的正确方法是什么?

    据我了解 Java中PreparedStatement的使用是我们可以多次使用它 但是我在使用Spring JDBC的PreparedStatementCreator时有些困惑 例如考虑以下代码 public class SpringTes
  • PowerShell - 枚举集合并更改集合

    如何修复这个脚本 是的 我正在更改 foreach 循环中的集合 这就是此错误的原因 枚举集合时发生错误 集合已修改 枚举操作可能无法执行 在 C Users user Documents PowerShell ChangeAllLists
  • Android SSO Okta 集成示例

    对 Okta 和 Android 不太了解 有谁知道一个很好的教程 它展示了如何将 Android 应用程序连接到 Okta 框架中 或者我是否实施 SAML SSO 实施 然后将 Okta 与其关联 任何代码示例都值得赞赏 特别是显示通用
  • “ceq”MSIL 命令和 object.InternalEquals 之间的区别

    我在 ILDASM 和 Reflector 中进行了深入研究 发现 被编译为 ceq MSIL 命令 object Equals 保持原样 object Equals 调用 对象 InternalEquals This https stac