使用非 32 位整数是否合理
Is using a non-32-bit integer reasonable?
可能的重复:
使用 16 位整数的重要性
如果今天的处理器(在标准条件下)执行 32 位操作 - 那么使用"short int"是否合理?因为为了对该数据执行操作,它会将其转换为32位(从16位)整数,执行操作,然后返回到16位 - 我认为。那么有什么意义呢?
本质上,我的问题如下:
- 使用较小范围的整数会带来什么(如果有)性能提升/障碍?例如,如果不是使用标准的 32 位整数进行存储,而是使用 16 位短整数。
- "然后回到16位" - 我在这里正确吗?见上文。
- 所有整数数据是否都存储在 CPU/RAM 上作为 32 位整数空间?
第一个问题的答案也应该澄清最后一个问题:如果您需要存储大量 16 位int
,则可以节省 32 位int
所需的一半内存量,并随之而来的任何"附加好处",例如更有效地使用缓存。
如今,大多数 CPU 都有单独的指令用于 16 位和 32 位操作,以及从内存读取和写入 16 位值的指令。在内部,ALU 可能正在执行 32 位操作,但上半部分的结果不会返回到寄存器中。
-
处理器不需要"扩展"一个值来使用它。它只是用零填充未使用的空格,并在执行计算时忽略它们。因此,实际上,在
short int
上运行比在long int
上运行更快,尽管使用当今快速的CPU,甚至很难注意到一点差异(双关语)。 -
机器并没有真正转换。更改值的大小时,它要么向左填充零,要么完全忽略左侧不适合目标内存区域的额外位。
-
不,这通常是人们将
short int
值用于不需要long int
范围的目的的原因。每个长度int
分配的内存是不同的,就像short int
占用的内存比long int
少。优化的步骤之一是在范围不超过short int
时将long int
值更改为short int
值,这意味着该值永远不会使用与long int
分配的额外位。在处理数组中的许多元素或相同struct
或class
的许多对象时,从这种优化中节省的内存实际上可能非常重要。
不同的int
大小以不同数量的位存储在RAM和内部处理器缓存中。float
、double
和long double
也是如此,尽管long double
主要用于64位系统,大多数编译器如果在32位机器上运行,就会忽略long
,因为32位累加器和ALU中的64位值在任何计算过程中都会被"砍掉",并且可能永远不会收到前32位的零。
使用较小范围的整数会带来什么(如果有的话)性能提升/障碍?例如,如果不是使用标准的 32 位整数进行存储,而是使用 16 位短整数。
它使用较少的内存。在正常情况下,它会使用一半的量。
"然后回到16位" - 我在这里正确吗?见上文。
它仅在您的代码需要时在 16 位和 32 位之间进行转换,而您未能显示。
所有整数数据是否都存储在 CPU/RAM 上作为 32 位整数空间?
No. 32 位处理器可以寻址并直接处理高达32 位的值。许多操作也可以对 8 位和 16 位值完成。
否是不合理的,除非你有某种(非常严格的)内存约束,你应该使用int
- 你不会获得性能,只会获得记忆。事实上,由于您刚才所说的话,您会失去性能,因为寄存器需要去除上位。
- 见上文
- 是取决于 CPU,不,它是 RAM 上的 16 位
使用较小的范围(如果有的话)性能增益/障碍会产生什么作用 整数带来?比如,如果不是使用标准的 32 位整数 存储,我使用 16 位短整数。
性能来自缓存局部性。 缓存中容纳的数据越多,程序运行的速度就越快。 如果您有很多short
值,则这一点更相关。
"然后回到16位" - 我在这里正确吗?
我对此不太确定。 我原本希望 CPU 可以并行优化多个操作,如果您可以将数据打包成 16 位,您将获得更大的吞吐量。 也可能与其他 32 位操作同时发生。 我在这里猜测,所以我就停下来!
所有整数数据是否都存储在 CPU/RAM 上作为 32 位整数空间?
不。 各种整数数据类型具有特定大小。 但是,当您使用char
时,您可能会遇到结构内部的填充,特别是short
。
速度效率并不是唯一的问题。 显然,您具有存储优势以及内在行为(例如,我编写了特定于性能的代码,该代码利用unsigned short
的整数溢出,这样我就不必执行任何模数)。 您还可以使用特定的数据大小来读取和写入二进制数据。 可能还有更多我没有提到的,但你明白了=)
- 检查输入是否不是整数或数字
- 是否基于数组B整数打印数组A中的整数
- 检查TCHAR数组输入是否为带符号整数C++
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- 如何检测除整数以外的任何内容是否传递给我的类构造函数?
- 检查字符串是否为整数
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- C++11 标准是否保证零值有符号整数的一元减号为零?
- 验证用户输入和整数是否C++
- 如何检查是否定义了固定宽度的整数
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- 将字符串转换为整数类型T,检查是否存在溢出
- 在C/C++中检查数字是否为整数(不带scanf/gets/etc)
- 整数指针数组的元素是否可以指向整数数组?
- 如何在 c++ 中解析包含整数的字符串并检查是否大于最大值
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- 整数浮点数除以自身是否保证为 1.f?