寄存器存储类用于快速访问变量,其内存在CPU中分配。但是 CPU 中的寄存器是有限的。我使用英特尔酷睿 i5-4260U 处理器。 我访问了英特尔网站以获取注册的详细信息。但是我找不到任何关于 cpu 包含多少寄存器的规范 (要访问网站,请单击此处(。 即使我能找到寄存器的数量((从 8086/8088 中有多少寄存器?但我无法弄清楚其中有多少被 c 存储类使用。
但是我找不到任何关于寄存器数量的规范 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
。根据生成的代码,可能需要一个或多个这些寄存器,因此可以进一步减少用于映射变量的可用寄存器的数量。
C中的寄存器关键字之所以包括在内,是因为在创建C时,编译器并不总是能很好地完成寄存器分配。 寄存器分配是编译器将程序变量映射到 CPU 寄存器的部分。
如今,编译器用于寄存器分配的算法总体上非常出色。 如此之多,以至于编译器经常忽略寄存器关键字,推理编译器比程序员更了解如何映射寄存器以最大限度地提高性能。
我不确定编译器"mcleod_ideafix"在写EAX
和EDX
不可用于寄存器分配时指的是什么。 gcc编译器在32位x86代码中使用6个整数寄存器(EAX
,EBX
,ECX
,EDX
,ESI
和EDI
(。 如果函数不进行任何函数调用并且您提供了正确的编译器选项,它甚至会使用 EBP
。 64位模式增加了8个寄存器R8
到R15
。 如果您使用的是 gcc,只需使用 -S
选项编译您的文件,然后查看生成的代码以查看使用了哪些寄存器。
要考虑的另一件事是,英特尔处理器使用称为寄存器重命名的功能来减少寄存器不足的性能损失。