【发布时间】:2018-04-12 11:55:29
【问题描述】:
这是否可以告诉编译器将某个全局变量放入寄存器中?因此有效地阻止了该寄存器在其他任何地方的使用。我知道这可能很困难,因为即使是对malloc() 的简单调用也需要暂时溢出。
我正在考虑它,因为我正在寻找一种方法来有效地为某种 VM 实现辅助堆栈,自然将辅助堆栈指针存储在另一个寄存器中会很棒。
【问题讨论】:
-
它可能取决于编译器,但我认为在 gcc 中类似
register int *foo asm ("r12");的全局范围内的东西会起作用。见6.44.5.1 Defining Global Register Variables。 -
@FlávioToribio:你可以做到这一点,但这当然需要所有模块都必须正确编译。包括标准库。或者 ABI 必须保证寄存器不会被函数破坏。这通常只对非常特殊的软件有意义,例如操作系统内核或裸机嵌入式。对于“正常”的应用程序代码,甚至考虑它都是不合理的。
-
更重要的是,这似乎是一个 XY 问题。
-
@EOF:我认为根本不存在 Y 问题。这只是一些不成熟(而且很可能有害)的优化方法。
-
@Someprogrammerdude:我不认为 Flavio 表示
register关键字,而是带有 gcc 扩展的整个构造。这实际上分配了 rewgister fort 变量。当然,如果其他代码不知道这个保留,你就有麻烦了。
标签: c optimization cpu-registers