【问题标题】:Where is the code generated for sqrt and __CIsqrt?为 sqrt 和 __CIsqrt 生成的代码在哪里?
【发布时间】:2011-02-09 16:52:00
【问题描述】:

我将 VC++ 设置为为调用 sqrt 的方法生成 ASM,以查看它是生成 FPU 还是 SSE 指令。但是,当调用 sqrt 时,我看不到 ASM。我只看到对某个函数 __CIsqrt 的调用,我认为它是某个系统 sqrt 函数。我看不到任何 ASM 以了解它在做什么?

【问题讨论】:

  • 听尼尔的——他是对的。进入任何库函数,例如strcpycosnew,您将看到它是如何完成的。如果你真的想要乐趣,请进入cout << someDouble

标签: c++ optimization code-generation profiling


【解决方案1】:

这是因为编译器没有生成代码 - 代码已经存在于库中。如果你想看,最简单的方法往往是在调试器中以汇编模式跟踪库函数调用。

【讨论】:

  • 只有 DLL 函数才会这样?如果静态链接我希望看到代码?或者它是生成的 ASM 的限制。如果不出意外,这是否证明 sqrt 在我的情况下没有被内联?
  • @John 这与 DLL 或静态无关 - 库就是库 - 代码存在于函数调用另一端的库中。这当然证明 sqrt 没有被内联,但我不希望它是。
【解决方案2】:

数学函数在库中实现。该库包含 FPU/SSE2 指令,但需要额外的代码来实现 /fp compile option。虽然大多数 CRT 代码在 VS 安装目录的 vc\crt\src 子目录中作为源代码提供,但数学函数并非如此。它是由英特尔编写的,他们可能不允许发布源代码。该库位于 vc\crt\src\intel\mt_lib\tran.lib 中。以兆字节为单位,实在是太多了,根本无法考虑拆解。

如果您想查看程序集,您应该使用 /MT 构建您的项目并使用调试器单步执行该功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2021-03-29
    • 1970-01-01
    • 2018-06-19
    相关资源
    最近更新 更多