关于c ++:为什么int的大小在某些编译器中有所不同?

Why does the size of an int vary in some compilers?

本问题已经有最佳答案,请猛点这里访问。

读取以下资源时,它表示int/指针的大小可能因编译器而异:

网址:http://www.c4learn.com/c-programming/c-size-of-pointer-variable/

为什么会这样?

我知道C只定义了一个类型应该保存的最小和最大数量,但是为什么一个编译器会选择将例如int设置为2个字节,另一个设置为4个字节?彼此的优势是什么?


虽然"为什么"可以用"因为标准是这样说的"来回答,但人们可以提出这样的论点,即标准可以以不同的方式书写,以保证特定的大小。

然而,C和C++的目的是在所有机器上产生非常快的代码。如果编译器必须确保int是该机器的"非自然大小",则需要额外的指令。在几乎所有情况下,这不是必需的,你只关心它"足够大,我想做什么"。因此,为了给编译器一个生成"好代码"的好机会,标准只指定了最小的大小,避免了编译器必须生成"额外代码",以使EDOCX1(和其他类型)以非常具体的方式工作。

C和C++的许多优点之一是,编译器有针对大量的机器,从8位和16位微控制器到大型,64位多核处理器,如PC机中的处理器,当然也有一些18, 24位或36位的机器。如果你的机器有36位本机大小,你不会很高兴,因为有些标准是这样说的,你得到一半的性能在整数数学由于额外的指令,不能使用一个int的前4位…

带8位寄存器的小型微处理器通常支持16位加法和减法(也可能是乘法和除法),但32位数学将涉及到这些指令的加倍[以及乘法和除法的更多工作]。所以16位整数(2字节)在这样一个小的处理器上更有意义——特别是因为内存可能也不太大,所以为每个整数存储4个字节是有点浪费。在32位或64位计算机中,内存范围很可能要大得多,因此拥有更大的整数并不是什么缺点,32位整数操作的速度与较小的整数相同(在某些情况下"更好"),例如在x86中,16位简单的数学操作(如加法或减法)需要额外的前缀字节来表示"make t他的16位",所以16位整数的数学运算将占用更多的代码空间)。


因为C标准规定:

(C99, 6.2.5p5)"A"plain" int object has the natural size suggested by the architecture of the execution environment"

c只为int(INT_MAX)可持有的最大值定义最小值,为int可持有的最小值定义最大值(INT_MIN)。