【问题标题】:Can an inline assembly (__asm) block prevent function optimisation?内联汇编 (__asm) 块可以阻止功能优化吗?
【发布时间】:2012-05-08 14:09:24
【问题描述】:

当使用 Microsoft Visual C++(不是 CLI,只是标准的原生 C++)时,内联汇编是否会导致函数的优化被禁用?

当我使用 IDA 检查时,块外的一些功能代码似乎确实发生了变化,但我不确定原因是什么。该函数(相对)简单,包含位操作和一些数学运算,但没有外部调用。

我能想到的其他可能原因是:

  • 额外配置以启用内联汇编中的调试。
  • 对异常处理的更改(虽然看起来并不像这样)
  • 由于某些未知的编译器逻辑,部分内联了其他内容。

有什么想法吗?

【问题讨论】:

    标签: c++ visual-c++ x86 inline-assembly


    【解决方案1】:

    是的。请参阅 MSDN 文章:Optimizing Inline Assembly 以及 Advantages of Inline Assembly

    来自文章:

    函数中存在__asm 块会以多种方式影响优化。首先,编译器不会尝试优化__asm 块本身。你用汇编语言写的正是你得到的。其次,__asm 块的存在会影响寄存器变量的存储。如果__asm 块更改寄存器的内容,编译器会避免在__asm 块中注册变量。最后,在函数中包含汇编语言会影响其他一些函数范围的优化。

    【讨论】:

    • 啊,所以它禁用了 some 但不是 all 优化。这完美地回答了我的问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    相关资源
    最近更新 更多