寄存器存储类用于快速访问变量,其内存在CPU中分配。但是cpu中的寄存器是有限的。我使用的是英特尔酷睿i5-4260U处理器。我已经访问了英特尔网站了解注册的详细信息。但我无法找到cpu包含多少寄存器的任何规范 (访问网站点击here)。 即使我能找到寄存器的数量((来自How many registers are there in 8086/8088?)) 但我无法弄清楚c存储类使用了多少这些。
答案 0 :(得分:0)
但我找不到任何有关多少寄存器的规范 cpu是否包含
只需查看“ia32编程模型”或“amd64编程模型”。
我无法弄清楚c存储类使用了多少这些。
这是依赖于实现的。编译器甚至可以忽略它。如果使用高级优化调用,它们中的一些使用自动寄存器映射,无论变量的声明方式如何。
例如:IA32上用户模式应用程序的编程模型由寄存器EAX
,EBX
,ECX
,EDX
,ESI
组成。 ,EDI
,EBP
,ESP
和EIP
。 EAX
和EDX
用作累加器,它们是某些指令的隐式操作数(MUL
,DIV
),它们保存函数的返回值。 EBP
和ESP
保留用于堆栈和帧管理。 EIP
是指令指针。因此,我们为EBX
,ECX
,EDI
和ESI
留下了寄存器映射。根据生成的代码,可能需要这些寄存器中的一个或多个,因此可以减少用于映射变量的可用寄存器的数量。
答案 1 :(得分:0)
包含了C中的寄存器关键字,因为在创建C时,编译器并不总能很好地完成寄存器分配。寄存器分配是将程序变量映射到CPU寄存器的编译器的一部分。
如今,编译器用于寄存器分配的算法总体上非常出色。因此编译器经常忽略寄存器关键字,推断编译器比编程器更了解如何映射寄存器以最大化性能。
我不确定是什么编译器' mcleod_ideafix'是指他写的时候EAX
和EDX
无法用于注册分配。 gcc 编译器在32位x86代码(EAX
,EBX
,ECX
,EDX
,ESI
中使用6个整数寄存器,和EDI
)。如果函数没有进行任何函数调用并且你给出了正确的编译器选项,它甚至会使用EBP
。 64位模式通过R8
增加了8个寄存器R15
。如果您正在使用 gcc ,只需使用-S
选项编译文件,然后查看生成的代码以查看使用的寄存器。
另一件需要考虑的事情是英特尔处理器使用名为register renaming的功能来降低没有足够寄存器的性能损失。