“自然大小”在C ++中的真正含义是什么?

时间:2014-06-23 16:22:50

标签: c++ performance int long-integer short

据我所知,'自然大小'是特定硬件最有效处理的整数宽度。在数组或算术运算中使用short时,必须首先将short整数转换为int

问:完全确定这个“自然尺寸”是什么?

我不是在寻找简单的答案,例如

  

如果它具有32位架构,则其自然大小为32位

我想了解 为什么 这是最有效的, 为什么 short必须在对其进行算术运算之前进行转换。

奖励问:对long整数进行算术运算会发生什么?

4 个答案:

答案 0 :(得分:8)

一般而言,每个计算机体系结构的设计使得某些类型的大小提供最有效的数值运算。具体大小取决于体系结构,编译器将选择合适的大小。关于硬件设计人员为特定硬件选择某些尺寸的原因的更详细解释将超出stckoverflow的范围。

在执行整数运算之前,short最常被提升为int,因为这与C中的方式相同,而C ++很少或没有理由继承该行为,可能破坏现有代码。我不确定它最初是在C中添加的原因,但可以推测它与"默认的int"相关。如果没有指定类型,则编译器会假定int

奖金A:从5/9(表达式)我们学习:Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result. This pattern is called the usual arithmetic conversions, which are defined as follows:

然后特别感兴趣:

  • 不重要的浮点规则
  • Otherwise, the integral promotions (4.5) shall be performed on both operands
  • Then, if either operand is unsigned long the other shall be converted to unsigned long.
  • Otherwise, if one operand is a long int and the other unsigned int, then if a long int can represent all the values of an unsigned int, the unsigned int shall be converted to a long int; otherwise both operands shall be converted to unsigned long int.
  • Otherwise, if either operand is long, the other shall be converted to long.

总之,编译器尝试使用" best"键入它可以进行二进制操作,int是最小的使用大小。

答案 1 :(得分:7)

  

'自然大小'是特定硬件最有效处理的整数宽度。

不是真的。考虑x64架构。从8到64位的任何大小的算术将基本上是相同的速度。那么为什么所有x64编译器都支持32位int?好吧,因为那里有很多代码,最初是为32位处理器编写的,而且很多代码都隐含地依赖于32位的内存。并且鉴于一种类型的近无用性可以表示高达九个数值的值,每个整数的额外四个字节实际上将是未使用的。因此,我们已经确定32位整数对于这个64位平台来说是“自然的”。

比较80286架构。寄存器中只有16位。在这样的平台上执行32位整数加法基本上需要将其分成两个16位加法。用它做几乎任何事情涉及将它分开,真的 - 和随之而来的减速。 80286的“自然整数大小”绝对是 32位。

所以,“自然”归结为处理效率,内存使用和程序友好等因素。这不是酸性测试。这很大程度上取决于架构/编译器设计者的主观判断。

答案 2 :(得分:2)

  

完全确定这个“自然尺寸”是什么?

对于某些处理器(例如32位ARM和大多数DSP式处理器),它由架构决定;处理器寄存器是一个特定的大小,只能对该大小的值进行算术运算。

其他(例如Intel x64)更灵活,并且没有单一的“自然”尺寸;编译器设计人员可以选择大小,效率,值范围和内存使用之间的折衷。

  

为什么这是最有效的

如果处理器要求值为算术的特定大小,则选择其他大小将强制您将值转换为所需大小 - 可能需要花费。

  

为什么必须在对它进行算术运算之前转换短路

据推测,在半个世纪前开发C时,这与常用处理器的行为非常匹配。 C ++继承了C语言的推广规则。我无法真正评论为什么它被认为是一个好主意,因为我当时并非出生。

  

long整数进行算术运算会发生什么?

如果处理器寄存器足够大以容纳long,那么算法将与int的算法大致相同。否则,必须将操作分解为多个寄存器之间分割的值的几个操作。

答案 3 :(得分:-1)

  

据我所知,'自然大小'是特定硬件最有效处理的整数宽度。

这是一个很好的开始。

  问:究竟是什么决定了这种“自然尺寸”?

上面的段落是“自然尺寸”的定义。没有别的决定。

  

我想了解为什么这是最有效的

根据定义。

  

为什么必须在对它进行算术运算之前转换short。

之所以如此,是因为C语言的定义如此。没有深层的架构原因(当C被发明时可能会有一些原因)。

  

奖金问:对长整数进行算术运算会发生什么?

一堆电子冲过肮脏的沙子,遇到一堆洞。 (不,真的。问一个模糊的问题......)