为什么所有数据类型int都取决于操作系统或编译器

时间:2012-12-13 20:06:05

标签: c++ operating-system

我想知道,在C / C ++中通常可用的所有数据类型中,为什么有些数据类型依赖于操作系统或编译器?

这有什么合乎逻辑的理由,还是仅仅是设计?

3 个答案:

答案 0 :(得分:2)

是。因为C / C ++在许多不同的机器架构上运行。

因此int被定义为机器的“自然大小” - 这使得编译器可以生成在该机器上运行良好的代码。

在现代机器上,通常是32位或64位。在较旧的机器上,它是16位。 在某些机器上(你可以查一下)它是24或36位。

C标准对这些类型的定义非常谨慎。 它需要一些东西(比如“long不能小于int”),同时将其他内容留给实现。

答案 1 :(得分:0)

int在这方面并不特别。每个整数数据类型都依赖于编译器。每种类型都有最小范围,类型的大小不减小:char - > short - > int - > long - > long long。符合要求的实现可以使它们全部为64位宽。

答案 2 :(得分:-1)

int类型应该是您正在使用的体系结构的自然大小。因此,在32位机器上,int通常为32位。在64位上,int通常为64位。 (64位机器上的32位操作系统可能是32位int。)

这样做的原因是效率。通常情况下,最大可表示的数量实际上并不重要,您只想使用最有效的类型。最常见的例子是循环。

for(int i=0; i< NUM_ITER; ++i) {
  // ...
}

对于大多数循环,迭代次数通常不是那么大。但即使你知道你不需要循环超过255次,比如使用unsigned char,因为你的循环计数器实际上在寄存器使用方面可能效率较低等等。

编辑:这是另一个例子。假设字大小是4个字节,并且你有一些函数从如下开始:

void foo() {
  static char x;
  static char y;
  // ...
}

一个天真的编译可能会将变量x放在某个地址,比如说0x0F00。然后变量y将由地址0x0F01的天真编译放置,因为x只需要1个字节。但是在许多体系结构中,内存访问针对4字节对齐的地址进行了优化,因此访问y可能实现为对0x0F00的4字节访问,然后丢弃其中3个字节。这显然在带宽消耗方面是浪费的,但更大的问题是为了在4字节字中打包/解包字节而必须进行的额外处理。

OTOH,如果xy可以大于1个字节(例如,如果你不依赖变量溢出作为算法的一部分),那么你会最好将它们声明为int。即使您的值<&lt; 256,每次最终访问4个字节,这是浪费,但不比前一个案例更多。但是,您不再需要打包或解压缩变量,因此开销就会消失。

关键是,如果您只是将xy声明为int,则无需担心32位架构与64位架构的对齐建筑。无论哪种方式,编译器都会做正确的事。