在32位CPU上,整数是4个字节,短整数是2个字节.如果我正在编写一个使用许多数值的C/C++应用程序,它总是符合短整数的提供范围,那么使用4字节整数或2字节整数会更有效吗?
我听说它建议4字节整数更有效,因为它适合从内存到CPU的总线带宽.但是,如果我将两个短整数相加,那么CPU是否会在一次通过中并行封装两个值(从而跨越总线的4字节带宽)?
如果您有大量数字,那么请使用最小的数字.由于您获得了两倍的缓存密度,因此使用16位短路阵列而不是32位整数将更有效.与高速缓存未命中的成本相比,CPU在32位寄存器中处理16位值所需的任何符号扩展的成本几乎可以忽略不计.
如果您只是在与其他数据类型混合的类中使用成员变量,那么它就不那么明确,因为填充要求可能会消除16位值的任何节省空间的好处.
是的,你肯定应该在32位CPU上使用32位整数,否则它可能最终屏蔽掉未使用的位(即,它总是以32位进行数学运算,然后将答案转换为16位)
它不会同时为您执行两个16位操作,但如果您自己编写代码并且您确定它不会溢出,则可以自己完成.
编辑:我应该补充一点,它在某种程度上取决于你对"效率"的定义.虽然它能够更快地执行32位操作,但您当然会使用两倍的内存.
如果这些用于某个内部循环的中间计算,则使用32位.但是,如果你是从磁盘读取它,或者即使你只需要为缓存未命中付费,那么使用16位整数仍然可能更好.与所有优化一样,只有一种方法可以知道:对其进行分析.
如果您使用"很多"整数值,则处理中的瓶颈可能是内存带宽.16位整数更紧密地包含在数据缓存中,因此可以获得性能.
如果你是对大量数据进行数字处理,你应该阅读Ulrich Drepper的"每个程序员应该知道的内容".专注于第6章,关于最大化数据缓存的效率.