为什么{64}编译器上int
通常为32位?当我开始编程时,我被教过int通常与底层架构的宽度相同。我同意这也是有道理的,我发现未指定的宽度整数与底层平台一样宽是合乎逻辑的(除非我们讨论8或16位机器,int
的这么小的范围将是几乎不适用。)
后来我了解到int
在大多数64位平台上通常是32位。所以我想知道这是什么原因。对于存储数据,我更喜欢明确指定数据类型的宽度,因此这留下了int
的通用用法,这不会提供任何性能优势,至少在我的系统上我具有32和64的相同性能位整数。这样就留下了二进制内存占用空间,虽然不是很多,但会略微减少......
答案 0 :(得分:12)
实施者方面选择不好?
严重的是,根据标准,“平原有了
执行体系结构建议的自然大小
环境“,这意味着64位上的64位int
机。人们可以轻易地争论其他任何事情
不符合的。但在实践中,问题更复杂:
从32位int
切换到64位int
将不允许
大多数程序来处理大型数据集或其他任何东西(不像
从16位切换到32位;大多数程序都可能
受到其他考虑的限制。它会增加
数据集的大小,从而减少局部性和减慢
程序下来。
最后(也可能是最重要的),如果int
是64位,
short
必须是16位或
32位,你无法指定另一个(除了
使用<stdint.h>
中的typedef,意图是这些
应该只在非常特殊的情况下使用)。
我怀疑这是主要动机。
答案 1 :(得分:6)
The Open Group在http://www.unix.org/whitepapers/64bit.html解释了历史,权衡和决策。它涵盖了各种数据模型,它们的优点和缺点以及对Unix规范所做的更改,以适应64位计算。
答案 2 :(得分:5)
int
已经长达32位,将它们更改为64位可能会导致比它解决的问题更多的问题。
答案 3 :(得分:2)
因为很多软件没有64位整数的优势。
使用64位int来计算可以用32位整数计算的东西(并且出于多种目的,最多40亿(或+/- 2亿)的值就足够了),并且将它们变大不会帮忙。
但是,使用更大的整数会对处理器缓存中“大小”整数的整数数量产生负面影响。因此,使它们变大会使涉及大量整数(例如数组)的计算花费更长时间,因为。
int
是机器字的自然大小,不是C ++标准规定的。在大多数16或32位机器的时代,将它制成16位或32位是有意义的,因为这对于那些机器来说是非常有效的尺寸。说到64位机器,它不再“有帮助”。所以保持32位int
更有意义。
编辑:
有趣的是,当Microsoft迁移到64位时,他们甚至没有使long
64位,因为它会破坏太多依赖long
为32位值的东西(或更重要的是,他们有很多依赖于long
在他们的API中是32位值的东西,有时客户端软件使用int
,有时使用long
,他们不希望这样打破)。
答案 4 :(得分:1)
主要原因是向后兼容性。此外,已有64位整数类型long
,浮点类型也是如此:float
和double
。为不同的体系结构更改这些基本类型的大小只会带来复杂性。此外,32位整数在范围方面响应了许多需求。
答案 5 :(得分:1)
我最初是为了回应this question而写的。我已经对其进行了一些修改,但基本上是相同的。
要开始使用,可以使用大于32位的纯整数,如C++ draft所述:
注意:普通整数旨在具有执行环境的体系结构建议的自然大小;提供其他有符号整数类型以满足特殊需要。 —笔记
强调我的
表面上看来这似乎表明,在我的64位体系结构(以及其他所有人的体系结构)上,普通int应该具有64位大小;这是体系结构建议的大小,对吗?但是,我必须断言,即使是64位架构,自然的大小也是32位。规范中的报价主要用于需要16位纯整数的情况,这是规范允许的最小大小。
最大的因素是约定俗成,从具有32位纯整数的32位体系结构开始,如果将其源代码保留为32位,那么对于设计人员和他们的用户来说,将其源代码更改为64位体系结构将更加容易方式:
首先,每个系统之间的差异越小,每个人的难度就越大。系统之间的差异只是大多数程序员的头疼:它们只会使跨系统运行代码变得更加困难。它甚至会添加到相对罕见的情况下,即您无法在32位和64位相同分布的计算机上执行此操作。但是,正如约翰·库格曼(John Kugelman)所指出的那样,架构已经从16位变为32位普通int,今天麻烦可以再做一次,这与他的下一个观点有关:
更重要的部分是它将导致整数尺寸或需要新类型的差距。因为sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
在实际规范中,所以如果将普通int移至64位,则会强制使用间隙。它从移动long
开始。如果将普通int调整为64位,则sizeof(int) <= sizeof(long)
将强制long
至少为64位的约束,从那里开始在大小上存在固有的差距。由于long
或普通int通常用作32位整数,并且现在都不可用,因此我们只有一种可以使用的数据类型short
。因为short
的最小长度为16位(如果您简单地放弃该大小,则可能变为32位并在理论上填补了这一空白),但是short
旨在针对空间进行优化,因此应该 像这样保持em>,还有 用例适用于小的16位整数。无论您如何安排尺寸,都会损失宽度,因此,完全不可用的int用例。较大的宽度并不一定意味着会更好。
这现在意味着需要更改规格,但是即使设计师无赖,很可能会因更改而损坏或过时。持久系统的设计人员必须处理整个系统中相互纠缠的代码,包括他们自己想要运行的系统代码,依赖项和用户代码,而这样做的大量工作却不考虑后果,这是不明智的
请注意,如果您的应用程序与> 32位整数不兼容,则可以使用static_assert(sizeof(int) * CHAR_BIT <= 32, "Int wider than 32 bits!");
。但是,谁知道规范将会发生变化,并且将实现64位纯整数,因此,如果您想成为将来的证明,请不要执行静态断言。
答案 6 :(得分:0)
因为没有人指出这一点。
int
保证在 -32767到32767之间( 2^16
)这是标准所要求的。如果您想在所有平台上支持64位数字,我建议使用支持的正确类型long long
( -9223372036854775807至9223372036854775807 )。
int
就可以是任何东西。
答案 7 :(得分:0)
C + +标准没有说明应该为int类型使用多少内存,告诉你应该至少为int类型使用多少内存。在许多32位指针变量的编程环境中,“int”和“long”都是32位长。