我有一个高度优化的C++片段,即使在远离热点的地方进行微小的改动也可以达到20%的性能.经过深入调查后发现,热点中使用的寄存器(可能)略有不同.我可以使用always_inline属性控制内联,但是我可以控制寄存器分配吗?
如果你真的想搞乱寄存器的分配,那么你可以强制GCC在某些寄存器中分配本地和全局变量.
您可以使用如下特殊变量声明执行此操作:
register int test_integer asm ("EBX");
适用于其他体系结构,只需将EBX替换为目标特定的寄存器名称即可.
有关这方面的更多信息,我建议您查看gcc文档:
http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/Local-Reg-Vars.html
我的建议是,除非你有充分的理由,否则不要乱用寄存器分配.如果您自己分配一些寄存器,那么分配器可以使用较少的寄存器,并且您可能最终得到的代码比您开始使用的代码更糟糕.
如果您的函数性能至关重要,那么在编译之间获得20%的性能差异,那么在内联汇编程序中编写该函数可能是个好主意.
编辑:正如strager指出的那样,编译器不会强制使用寄存器来表示变量.如果完全使用变量,它只被强制使用寄存器.例如,如果变量不能在优化过程中存活,则不会使用它.该寄存器也可用于其他变量.