整数和寄存器大小之间有关系吗?

Bur*_*gan 3 c++ memory cpu integer cpu-registers

最近,我在最近的一次采访中遇到了字符串操作问题,并被要求优化性能。我必须使用迭代器在 TCHAR 字符之间来回移动(支持 UNICODE - 每个字符 2 个字节)。

并没有真正考虑数组长度,我犯了一个重大错误,没有使用 size_t 而是使用 int 进行迭代。我知道它不合规且不安全。

int i, size = _tcslen(str);    
for(i=0; i<size; i++){
   // code here
}
Run Code Online (Sandbox Code Playgroud)

但是,我们可以分配的最大内存是有限的。如果 int 和寄存器大小之间存在关系,则使用整数可能是安全的。

例如:如果没有任何虚拟映射工具,我们只能映射2^寄存器大小的字节。由于 TCHAR 的长度是 2 个字节,因此是该数字的一半。对于任何具有 32 位 int 的系统,即使您不使用 int 的无符号版本,这也不会成为问题。有嵌入式背景的人过去都认为int是16位的,但是在这样的设备上内存大小会受到限制。所以我想知道整数和寄存器大小之间是否存在架构微调决策。

jal*_*alf 6

C++ 标准没有指定 int 的大小。(它说sizeof(char) == 1,并且sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)

因此,与寄存器大小不一定关系。完全一致的 C++ 实现可以在具有 32 位寄存器的 PC 上为您提供 256 字节整数。但这样效率会很低。

所以,是的,实际上,int数据类型的大小通常等于 CPU 通用寄存器的大小,因为这是迄今为止最有效的选择。

如果 anint大于寄存器,那么简单的算术运算将需要多个指令,这将是昂贵的。如果它们小于寄存器,则加载和存储寄存器的值将需要程序屏蔽未使用的位,以避免覆盖其他数据。(这就是为什么int数据类型通常比 更有效short。)

(有些语言只是要求int32 位,在这种情况下,显然与寄存器大小没有关系 --- 除了选择 32 位之外,因为它是常见的寄存器大小)