整数和寄存器大小之间是否存在关系?

时间:2009-07-03 10:29:05

标签: c++ memory integer cpu cpu-registers

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

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

int i, size = _tcslen(str);    
for(i=0; i<size; i++){
   // code here
}

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

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

6 个答案:

答案 0 :(得分:4)

C ++标准没有指定int的大小。 (它表示sizeof(char) == 1sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)

因此 与寄存器大小无关。完全符合C ++的实现可以在PC上为32位寄存器提供256字节整数。但它效率低下。

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

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

(有些语言只需要int为32位,在这种情况下显然与寄存器大小无关 - 除了选择32位,因为它是一个通用的寄存器大小)

答案 1 :(得分:3)

严格遵循标准,无法保证int的大小,更不用说与寄存器大小的关系。此外,某些体系结构具有不同大小的寄存器(即:并非CPU上的所有寄存器都具有相同的大小),并且不总是仅使用一个寄存器(如DOS及其Segment:Offset寻址)访问存储器。 尽管如此,在大多数情况下,int与“常规”寄存器的大小相同,因为它应该是最常用的基本类型,而且这是优化CPU运行的。

答案 2 :(得分:2)

AFAIK,寄存器大小与int的大小没有直接联系。

但是,由于您知道要编译应用程序的平台,因此可以使用所需的大小定义自己的类型别名:

实施例

#ifdef WIN32 // Types for Win32 target
#define Int16 short
#define Int32 int
// .. etc.
#elif defined // for another target

然后,使用声明的别名。

答案 3 :(得分:2)

我不完全清楚,如果我理解这是正确的,因为这里混合了一些不同的问题(内存大小,分配,寄存器大小,性能?)。

我能说的是(只是标题),在大多数实际处理器上,为了获得最大速度,你应该使用与寄存器大小相匹配的整数。原因是,当使用较小的整数时,您具有需要较少内存的优势,例如在x86架构上,需要额外的转换命令。同样在英特尔你有问题,访问未对齐(主要是在寄存器大小的边界)内存将给一些阴茎。当然,在今天的处理器上,事情甚至更复杂,因为CPU能够并行处理命令。所以你最终会对一些架构进行微调。

所以最好的猜测 - 在不知道架构的情况下 - 使用寄存器大小的注释,只要你能负担得起内存。

答案 4 :(得分:2)

我没有该标准的副本,但我的 The C Programming Language 的旧副本说(第2.2节)int指的是“一个整数,通常反映自然主机上的整数大小。“我的 C ++编程语言的副本说(第4.6节)“int类型应该被选择为最适合在给定计算机上保存和操作整数。”

你不是唯一一个说“我会承认this is technically a flaw, but it's not really exploitable”的人。

答案 5 :(得分:2)

有不同种类的寄存器,大小不同。重要的是地址寄存器,而不是通用寄存器。如果机器是64位,则地址寄存器(或它们的某些组合)必须是64位,即使通用寄存器是32位。在这种情况下,编译器可能需要做一些额外的工作来使用多个通用寄存器来实际计算64位地址。

如果您认为硬件制造商不会为其寄存器做出奇怪的设计选择,那么您可能永远不必处理原始的8086“real mode”寻址。

相关问题