读取以下资源时,它表示int /指针的大小可能因编译器而异:
http://www.c4learn.com/c-programming/c-size-of-pointer-variable/
为什么会这样?
我理解C只定义了一个类型应该保存的最小和最大数量,但为什么一个编译器选择将例如int设置为2个字节而另一个设置为4?一个人比另一个人有什么优势?
答案 0 :(得分:6)
虽然“为什么”可以用“因为标准这样说”来回答,但人们可以提出这样的论点:标准可以用不同的方式书写,以保证特定的大小。
然而,C和C ++的目的是在所有机器上生成非常快的代码。如果编译器必须确保int
是该机器的“不自然大小”,则需要额外的指令。对于几乎所有情况,这都不是必需的,你所关心的只是“它足够大,我想做什么”。因此,为了给编译器提供生成“良好代码”的良好机会,该标准仅指定最小大小,避免编译器必须生成“额外代码”以使int
(和其他类型)在非常特定的情况下运行办法。
C和C ++的众多优势之一是有针对各种机器的编译器,从小型8位和16位微控制器到大型64位多核处理器,如PC中的那些。当然,还有一些18,24或36位的机器。如果您的机器具有36位原生大小,那么如果因为某些标准这样说,由于额外的指令,您将获得整数数学性能的一半,并且不能使用前4位int
...
一个带有8位寄存器的小型微处理器通常支持进行16位加法和减法(也许还有乘法和除法),但32位数学运算会涉及将这些指令加倍[以及更多的乘法运算和工作划分]。所以16位整数(2字节)在这么小的处理器上会更有意义 - 特别是因为内存可能也不是很大,所以为每个整数存储4个字节有点浪费。在32位或64位机器中,存储器范围很可能要大得多,因此具有较大的整数并不是一个缺点,32位整数运算与较小的运算速度相同(在某些情况下) “更好” - 例如在x86中,16位简单的数学运算(如加法或减法)需要额外的前缀字节来表示“使这个16位”,因此16位整数的数学会占用更多的代码空间)。
答案 1 :(得分:1)
因为C标准说:
(C99,6.2.5p5)“A”普通“int对象具有执行环境体系结构建议的自然大小”
C仅定义int
(INT_MAX
)可容纳的最大值的最小值,int
可容纳的最小值的最大值(INT_MIN
)。