Kos*_*nov 2 c++ optimization assembly
我曾经多次听说编译器不会优化内联汇编,或者内联汇编对它来说是一个黑盒子.我很怀疑,因为我没有看到编译器失败的任何情况,我不在乎.
但今天我在GCC维基上找到了一个名为DontUseInlineAsm的页面.它包含了人们之前告诉我的相同问题,但没有详细说明为什么编译器不理解内联asm,因此不会优化它.那么,有没有人知道编译器不做这些优化的原因?
当然,我正在收拾特殊情况
asm volatile("" : : "g"(value) : "memory");
要么
asm volatile("" : : : "memory");
当我们明确地告诉编译器这个代码有可见的副作用时,因此它不应该优化它.
Mik*_*kis 11
您的问题似乎是基于编译器首先生成程序集的错误假设,然后,如果您想要优化输出,那么它会读取它生成的程序集,对其进行优化并将其写回.如果是这种情况,那么读取和优化内联汇编应该没什么大不了的,对吧?
编译器不会优化内联汇编,因为编译器根本不会优化任何汇编.编译器无法在所需级别上理解汇编,以便使用它执行优化.这不关它的事.
编译器生成通过执行特殊的技巧与它的内部数据结构优化的机器码,(解析树,中间语言,如p代码,等等),这是未装配.
如果涉及程序集生成步骤,则它是一个只写步骤,这意味着编译器将为您生成此程序集,但它永远不会尝试读取它.这是汇编程序的工作.我从未听说过优化的汇编程序.
因此,可以非常安全地假设没有编译器会尝试优化任何人的内联汇编.
我不了解你,但坦率地说,如果编译器试图修改我的内联汇编,我会非常恼火.如果我要使用汇编,我会这样做,因为我知道(或者我认为我知道)比编译器更好.