'Natural Size' C++的真正含义是什么?
What does 'Natural Size' really mean in C++?
我理解"自然大小"是指特定硬件处理效率最高的整数宽度。当在数组或算术运算中使用short
时,必须先将short
整数转换为int
。
问:究竟是什么决定了这个"自然大小"?
我不是在寻找简单的答案,如
如果它是32位架构,它的自然大小是32位
我想理解为什么这是最有效的,以及为什么一个short
必须在对其进行算术运算之前进行转换。
奖励Q:当对long
整数进行算术运算时会发生什么?
一般来说,每一种计算机体系结构都设计成特定的类型大小提供最有效的数值运算。具体的大小取决于体系结构,编译器将选择一个合适的大小。关于为什么硬件设计者为特定硬件选择特定尺寸的更详细的解释将超出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.
总的来说,编译器试图使用"最佳"类型来进行二进制操作,int
是使用的最小类型。
"自然大小"是指一个特定硬件处理效率最高的整数的宽度。
没有。考虑x64架构。从8位到64位的任何大小的算术基本上都是相同的速度。那么为什么所有的x64编译器都选择32位的int
呢?因为有很多代码最初是为32位处理器编写的,其中很多都隐含地依赖于整数是32位的。考虑到一个可以表示高达9万亿的值的类型几乎是无用的,每个整数额外的4个字节实际上是没有使用的。所以我们决定32位整型对于64位平台来说是"自然的"。
比较80286架构。寄存器中只有16位。在这样的平台上执行32位整数加法基本上需要将其拆分为两个16位加法。实际上,用它做任何事情都需要拆分它,真的——以及随之而来的减速。80286的"自然整数大小"绝对是而不是 32位。
因此,真正的"自然"归结为诸如处理效率、内存使用和程序员友好性等方面的考虑。这不是一个严峻的考验。这在很大程度上取决于体系结构/编译器设计者的主观判断。
是什么决定了这个"自然大小"?
对于某些处理器(例如32位ARM和大多数dsp风格的处理器),它是由架构决定的;处理器寄存器有一个特定的大小,算术运算只能在这个大小的值上进行。
其他(例如Intel x64)更加灵活,并且没有单一的"自然"大小;大小的选择取决于编译器设计者,这是效率、值范围和内存使用之间的折衷。
为什么这是最有效的
如果处理器要求值为特定的算术大小,那么选择另一种大小将迫使您将值转换为所需的大小-可能要付出代价。
为什么在对其进行算术运算之前必须对其进行转换
可以推测,这与半个世纪前开发C语言时常用处理器的行为非常吻合。c++继承了C的提升规则。我真的不能确切地评论为什么它被认为是一个好主意,因为我当时还没有出生。
当对
long
整数进行算术运算时会发生什么?
如果处理器寄存器足够大,可以容纳long
,那么算法将与int
大致相同。否则,这些操作将不得不被分解为对多个寄存器之间的值进行的几个操作。
我理解"自然尺寸"是指特定硬件处理效率最高的整数的宽度。
这是一个很好的开始。
问:究竟是什么决定了这种"自然尺寸"?
以上段落是"自然尺寸"的定义。没有别的东西决定它。
通过定义。我想知道为什么这是最有效的
以及为什么在对其进行算术运算之前必须对其进行转换。
这是因为C语言的定义是这样说的。没有深层次的架构原因(在C语言发明的时候可能有一些)。
奖励Q:当对长整数进行算术运算时会发生什么?
一束电子穿过肮脏的沙子,遇到一束空穴。(不,真的。问一个模糊的问题…)
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 'Natural Size' C++的真正含义是什么?