Arm Cortex架构中的局部变量是存储在寄存器还是堆栈中?

Arm Cortex架构中的局部变量是存储在寄存器还是堆栈中?,c,arm,embedded,C,Arm,Embedded,我记得对一个简单的arm示例进行了一些反汇编,局部变量似乎存储在寄存器中,而不是存储在堆栈中。手臂总是这样吗 一个,或另一个,或两者。取决于类型、值、数量、大小、体系结构、寄存器计数、寄存器空闲、月相、Jon Skeet今天早上从床的哪一边出来。局部变量的存储是编译器的问题,而不是处理器体系结构的问题。此外,当编译器优化启用时,它更有可能使用寄存器存储 任何编译器都可能在任何体系结构上实现这一点,但与x86相比,ARM拥有更大、更正交的寄存器集,因此您可能更容易在ARM代码中观察到寄存器存储 当

我记得对一个简单的arm示例进行了一些反汇编,局部变量似乎存储在
寄存器
中,而不是存储在
堆栈
中。手臂总是这样吗

一个,或另一个,或两者。取决于类型、值、数量、大小、体系结构、寄存器计数、寄存器空闲、月相、Jon Skeet今天早上从床的哪一边出来。

局部变量的存储是编译器的问题,而不是处理器体系结构的问题。此外,当编译器优化启用时,它更有可能使用寄存器存储

任何编译器都可能在任何体系结构上实现这一点,但与x86相比,ARM拥有更大、更正交的寄存器集,因此您可能更容易在ARM代码中观察到寄存器存储


当然,当存在大量变量和较大的聚合类型时,仍将使用堆栈。优化人员将分析代码流,并选择哪些变量可能最好地存储在寄存器中以获得最佳性能。

一百个局部变量如何?似乎不太可能……给定一个健全的编译器和ABI,它通常适用于任何具有通用寄存器的对象。这就是他们的观点……如果你需要获取变量的地址怎么办?@EugeneSh。然后,当您获取该变量的地址时,该变量将被放入堆栈中。但是,请记住,局部变量仅在其声明范围内时才存在。一旦您离开作用域,该地址就不再有效。@SouravGhosh:编译器将根据需要管理局部变量集,并在寄存器中循环变量。有些变量只存在于寄存器中(特别是当它们只是计算中的中间值时)。还有一些需要暂时存在于堆栈上,但这都是由编写的代码、处理器体系结构和函数调用约定驱动的。编译器保证正确性,但不一定保证性能。其中一个问题是,我不确定我是应该向上投票(因为正确)还是向下投票(因为没有帮助)。我忘记了“调用约定”:(你忘记了很多事情,例如,如果OP出生在木星升空下,在加里弗雷生活过一次(希望不是-没有冒犯),等等。