您编写了一个函数,并查看生成的程序集,您会发现它可以得到改进。
为了便于阅读,您希望保留您编写的函数,但是您希望将自己的程序集替换为编译器。有没有办法在你的高生活语言功能和新程序集之间建立关系?
答案 0 :(得分:3)
如果您正在查看程序集,那么可以假设您已经很好地理解了如何编译代码。如果你有这方面的知识,那么它有时可能会“改变引擎”将更改重新恢复为原始语言,但通常最好不要打扰。
与首次进行这些更改所需的时间和精力相比,您所做的优化可能非常小。我建议你把这种工作留给编译器去喝杯茶。如果变化很大,并且性能至关重要(如在嵌入式世界中那样),那么您可能希望以某种方式将常规代码与组合混合,但是,在大多数计算机和芯片上,性能通常足以避免这头疼。
如果确实需要更高的性能,那么优化代码而不是程序集。
答案 1 :(得分:2)
没有,我想。你已经拒绝了编译器的工作,而是赞成你自己的工作。你可能会抛弃你在编译语言中编写的函数,因为现在你所拥有的只是你在那个平台上的汇编程序。
我强烈建议不要进行这种优化,因为除非你确定,通过剖析和分析,你确实在做出改变。
答案 2 :(得分:1)
这取决于你编写函数的语言。像C这样的语言非常低级,将每个函数调用或语句转换为特定的汇编语句。如果您确实使用了C,则可以使用内联汇编替换函数以提高性能。
其他高级语言可能会将每个语句转换为宏程序或程序集端的其他更复杂的调用。某些优化(如尾递归,循环展开等)可以在源端轻松实现,但其他优点(如更有效地使用寄存器文件)可能是不可能的(同样,取决于语言和编译器,你是使用)。
答案 3 :(得分:1)
很难说修改后的程序集与生成未修改版本的源之间存在任何关系。它肯定会混淆调试工具:寄存器内容将不再与它们应该对应的源变量匹配。
在数据包处理代码中有很多地方我已经检查了生成的程序集,然后返回更改原始源代码以改进结果。重新安排源可以减少分支数量,__ attribute__和编译器参数可以对齐分支点和函数以减少I $未命中。在绝望的情况下,可以使用一些内联汇编,以便仍然可以从源代码编译二进制文件。
答案 4 :(得分:1)
你可以尝试的是将原始函数分离到自己的文件中,并提供一个make规则来从那里构建汇编程序。然后使用改进的版本更新汇编程序文件,并提供make规则以从汇编程序文件构建目标文件。然后更改链接规则以包含该目标文件。
如果您只更改了汇编程序文件,那么它将继续使用。如果您更改了原始的更高级语言文件,则将重建汇编程序文件,并从新的(未改进的)版本构建目标文件。
这给你两者之间的关系;您可能希望在更高级别语言文件的顶部添加警告注释以警告该行为。如果你在这里犯了错误,使用某种形式的VCS将使你能够恢复改进的汇编程序文件。
答案 5 :(得分:1)
如果您在Visual C ++中编写本机编译的应用程序,有两种方法:
__asm { }
块并在那里编写汇编程序。extern "C"
声明声明该函数。其他C / C ++编译器也有类似的方法。
答案 6 :(得分:1)
在这种情况下,您通常有两个选择:优化代码或重写编译器。我无法看到在源和操作之间断开链接的地方将成为正确的解决方案。