我听说过几次编译器不会优化内联程序集,或者内联程序集是它的黑匣子。我很怀疑,因为我没有看到编译器失败的任何情况,所以我不在乎。
但今天,我在GCC维基上找到了一个名为DontUseInlineAsm的页面。它包含了人们之前告诉我的问题,但是没有关于为什么编译器不理解内联asm,因此也不会优化它的细节。那么,有谁知道编译器不进行这些优化的原因吗?
当然,我把一些特殊的案子放在一边
asm volatile("" : : "g"(value) : "memory");或
asm volatile("" : : : "memory");
当我们显式地告诉编译器,这段代码有明显的副作用,因此它不应该优化它。
发布于 2016-11-13 21:08:42
编译器不会对内联程序集进行优化,因为这会达到目的。当程序员觉得自己比编译器更了解时,或者程序员认为他们可以生成更好的代码,或者编译器无法生成他们想要的代码时,就会使用内联程序集。在前一种情况下,程序员是在优化汇编代码本身,如果编译器在优化等效的C代码方面做得不够好,那么它不太可能改进汇编代码。在以后的情况下,没有等效的C代码,内联程序集使用编译器无法生成的指令或其他程序集特性。在这种情况下,也不太可能理解这些指令是如何优化代码的。
没有编译器能够像您在注释中建议的那样,将内联程序集转换为其内部“字节代码”。GCC将内联程序集作为字符串粘贴到其程序集输出中。它完全不理解字符串中的代码。Clang通常不会生成作为输出的程序集,因此它有一个内置的汇编程序,但是它也没有真正理解程序集代码。它只是将其转换为机器代码,然后插入到对象文件输出中。Microsoft的编译器是另一个通常不生成程序集代码输出的编译器,它实际上对程序集有一定的理解,但程度有限。它只了解代码使用的寄存器之类的内容,因此编译器会执行诸如保留内联程序集使用的寄存器之类的操作。它不知道程序集代码实际上做了什么。
如果希望编译器优化代码,请不要使用内联程序集。即使它不是一个直接对应于您想要的程序集代码的语言特性,编译器也可能可以生成它,就像Mike在关于ROTL的评论中所建议的那样。您还可以使用内置的函数,这些函数扩展了语言,并对应于各种程序集指令,在许多情况下编译器都能够进行优化。
https://stackoverflow.com/questions/40578028
复制相似问题