2016-12-30 97 views
-3

我读过CPU寄存器是有限的,并且该值也可以存储在auto中。将变量存储在CPU寄存器中

如何确认变量是否存储在C寄存器中?

可以存储什么样的变量?

+3

'register'可以被编译器忽略,并且会被许多现代编译器用于分配寄存器。今天只有不被允许采用地址的副作用是唯一相关的用例。其余的:你的问题太广泛了。阅读CPU如何工作,**特定** CPU的参考手册以及您的平台的ABI。 – Olaf

回答

2

大多数编译器都支持生成汇编语言输出的标志,例如-S/S。您可以检查此代码,以查看您的编译器是否将给定变量存储在给定点的寄存器中。

没有类型保证适合注册。事实上,一些基于堆栈的机器,包括Andrew Tannenbaum教科书中JVM的硬件实现,根本没有明确的寄存器。但是,int的大小通常与寄存器的大小相同(64位环境定义为intlong,因为向后兼容性是32位的例外情况),因此指针通常保存一个机器地址,因此通常与寄存器的大小相同(分段内存模型,例如16位x86,其中地址适合两个寄存器,是例外),并且size_tptrdiff_t保存数组索引,因此通常与寄存器大小相同(x32目标,它具有64位代码但是一个32位内存空间,是一个例外)。大多数CPU都有浮点寄存器,每个浮点寄存器可以容纳一个double来对其进行数学运算,但有些则不是。

如果你想要的是快速便携式代码,你最好的选择是使用int_fast16_tuint_fast32_t这些类型从<stdint.h>。这些保证是通常最快的尺寸,至少足够宽。而在正常的目标上,这将是一个机器寄存器的大小。