将变量存储在CPU寄存器中
答
大多数编译器都支持生成汇编语言输出的标志,例如-S
或/S
。您可以检查此代码,以查看您的编译器是否将给定变量存储在给定点的寄存器中。
没有类型保证适合注册。事实上,一些基于堆栈的机器,包括Andrew Tannenbaum教科书中JVM的硬件实现,根本没有明确的寄存器。但是,int
的大小通常与寄存器的大小相同(64位环境定义为int
和long
,因为向后兼容性是32位的例外情况),因此指针通常保存一个机器地址,因此通常与寄存器的大小相同(分段内存模型,例如16位x86,其中地址适合两个寄存器,是例外),并且size_t
和ptrdiff_t
保存数组索引,因此通常与寄存器大小相同(x32目标,它具有64位代码但是一个32位内存空间,是一个例外)。大多数CPU都有浮点寄存器,每个浮点寄存器可以容纳一个double
来对其进行数学运算,但有些则不是。
如果你想要的是快速便携式代码,你最好的选择是使用int_fast16_t
和uint_fast32_t
这些类型从<stdint.h>
。这些保证是通常最快的尺寸,至少足够宽。而在正常的目标上,这将是一个机器寄存器的大小。
'register'可以被编译器忽略,并且会被许多现代编译器用于分配寄存器。今天只有不被允许采用地址的副作用是唯一相关的用例。其余的:你的问题太广泛了。阅读CPU如何工作,**特定** CPU的参考手册以及您的平台的ABI。 – Olaf