我想知道,在C / C ++中通常可用的所有数据类型中,为什么有些数据类型依赖于操作系统或编译器?
这有什么合乎逻辑的理由,还是仅仅是设计?
答案 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
,因为你的循环计数器实际上在寄存器使用方面可能效率较低等等。
void foo() {
static char x;
static char y;
// ...
}
一个天真的编译可能会将变量x
放在某个地址,比如说0x0F00
。然后变量y
将由地址0x0F01
的天真编译放置,因为x
只需要1个字节。但是在许多体系结构中,内存访问针对4字节对齐的地址进行了优化,因此访问y
可能实现为对0x0F00
的4字节访问,然后丢弃其中3个字节。这显然在带宽消耗方面是浪费的,但更大的问题是为了在4字节字中打包/解包字节而必须进行的额外处理。
OTOH,如果x
和y
可以大于1个字节(例如,如果你不依赖变量溢出作为算法的一部分),那么你会最好将它们声明为int
。即使您的值<&lt; 256,每次最终访问4个字节,这是浪费,但不比前一个案例更多。但是,您不再需要打包或解压缩变量,因此开销就会消失。
关键是,如果您只是将x
和y
声明为int
,则无需担心32位架构与64位架构的对齐建筑。无论哪种方式,编译器都会做正确的事。