首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化器:优化内嵌组件

优化器:优化内嵌组件
EN

Stack Overflow用户
提问于 2016-11-13 19:39:25
回答 1查看 1.4K关注 0票数 2

我听说过几次编译器不会优化内联程序集,或者内联程序集是它的黑匣子。我很怀疑,因为我没有看到编译器失败的任何情况,所以我不在乎。

但今天,我在GCC维基上找到了一个名为DontUseInlineAsm的页面。它包含了人们之前告诉我的问题,但是没有关于为什么编译器不理解内联asm,因此也不会优化它的细节。那么,有谁知道编译器不进行这些优化的原因吗?

当然,我把一些特殊的案子放在一边

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

asm volatile("" : : : "memory");

当我们显式地告诉编译器,这段代码有明显的副作用,因此它不应该优化它。

EN

回答 1

Stack Overflow用户

发布于 2016-11-13 21:08:42

编译器不会对内联程序集进行优化,因为这会达到目的。当程序员觉得自己比编译器更了解时,或者程序员认为他们可以生成更好的代码,或者编译器无法生成他们想要的代码时,就会使用内联程序集。在前一种情况下,程序员是在优化汇编代码本身,如果编译器在优化等效的C代码方面做得不够好,那么它不太可能改进汇编代码。在以后的情况下,没有等效的C代码,内联程序集使用编译器无法生成的指令或其他程序集特性。在这种情况下,也不太可能理解这些指令是如何优化代码的。

没有编译器能够像您在注释中建议的那样,将内联程序集转换为其内部“字节代码”。GCC将内联程序集作为字符串粘贴到其程序集输出中。它完全不理解字符串中的代码。Clang通常不会生成作为输出的程序集,因此它有一个内置的汇编程序,但是它也没有真正理解程序集代码。它只是将其转换为机器代码,然后插入到对象文件输出中。Microsoft的编译器是另一个通常不生成程序集代码输出的编译器,它实际上对程序集有一定的理解,但程度有限。它只了解代码使用的寄存器之类的内容,因此编译器会执行诸如保留内联程序集使用的寄存器之类的操作。它不知道程序集代码实际上做了什么。

如果希望编译器优化代码,请不要使用内联程序集。即使它不是一个直接对应于您想要的程序集代码的语言特性,编译器也可能可以生成它,就像Mike在关于ROTL的评论中所建议的那样。您还可以使用内置的函数,这些函数扩展了语言,并对应于各种程序集指令,在许多情况下编译器都能够进行优化。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40578028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档