优化器:优化内联汇编

Kos*_*nov 2 c++ optimization assembly

我曾经多次听说编译器不会优化内联汇编,或者内联汇编对它来说是一个黑盒子.我很怀疑,因为我没有看到编译器失败的任何情况,我不在乎.

但今天我在GCC维基上找到了一个名为DontUseInlineAsm的页面.它包含了人们之前告诉我的相同问题,但没有详细说明为什么编译器不理解内联asm,因此不会优化它.那么,有没有人知道编译器不做这些优化的原因?

当然,我正在收拾特殊情况

asm volatile("" : : "g"(value) : "memory"); 要么
asm volatile("" : : : "memory");

当我们明确地告诉编译器这个代码有可见的副作用时,因此它不应该优化它.

Mik*_*kis 11

您的问题似乎是基于编译器首先生成程序集的错误假设,然后,如果您想要优化输出,那么它会读取它生成的程序集,对其进行优化并将其写回.如果是这种情况,那么读取和优化内联汇编应该没什么大不了的,对吧?

编译器不会优化内联汇编,因为编译器根本不会优化任何汇编.编译器无法在所需级别上理解汇编,以便使用它执行优化.这不关它的事.

编译器生成通过执行特殊的技巧与它的内部数据结构优化的机器码,(解析树,中间语言,如p代码,等等),这是装配.

如果涉及程序集生成步骤,则它是一个只写步骤,这意味着编译器将为您生成此程序集,但它永远不会尝试读取它.这是汇编程序的工作.我从未听说过优化的汇编程序.

因此,可以非常安全地假设没有编译器会尝试优化任何人的内联汇编.

我不了解你,但坦率地说,如果编译器试图修改我的内联汇编,我会非常恼火.如果我要使用汇编,我会这样做,因为我知道(或者我认为我知道)比编译器更好.

  • 是的,所以我的预测正确.我现在对此有一种舒适的感觉.C - :=嗯,正如我所说,编译器不会做"用它的内部字节代码替换汇编"之类的东西.将程序集转换为除机器代码之外的任何东西都是一项非常艰巨的任务,我怀疑是否有任何工具甚至可以远程成功.所以,如果你觉得自己能够做到这一点,那就给自己一个博士学位.在你面前,谎言只不过是名利双收. (2认同)
  • @KostyaBazhanov:迈克是对的.编译器将C或C++转换为代码所做内容的内部表示,并对其进行优化.二进制到二进制优化是一项艰巨的任务,因为可用的信息要少得多.例如,在C中,编译器知道函数末尾的临时寄存器中的值无关紧要,只知道返回值.asm到asm优化器必须弄清楚在修改函数的代码时是否在EDX中保留不同的值是否正确. (2认同)