【发布时间】:2017-02-08 08:16:36
【问题描述】:
我的电脑有 64 位处理器,当我查找 sizeof(int)、sizeof(long) 和 sizeof(long long) 时,结果发现 int 和 long 是 32位,而 long long 是 64 位。我研究了原因,似乎流行的假设告诉 C++ 中的 int 适合机器的字长是错误的。据我了解,由编译器来定义大小,我的是 Mingw-w64。我研究的原因是了解如果使用小于字长的类型对速度有好处(例如,short vs int)或者如果它有负面影响。在 32 位系统中,一种流行的观点是:由于字长为 int,short 将被转换为 int,它会导致额外的位移等,从而导致性能下降。反对意见是缓存级别会有好处(我没有深入研究),使用 short 将有助于虚拟内存经济。所以,除了混淆这个困境之外,我还面临另一个问题。我的系统是 64 位的,不管我使用 int 还是 short ,它仍然会小于字长,我开始认为不会t 使用 64 位 long long 是有效的,因为它处于系统设计的水平。另外我读到还有另一个约束,即定义类型大小的操作系统库(ILP64,LP64)。在 ILP64 中,默认 int 是 64 位,与 LP64 相比,如果我使用支持 ILP64 的操作系统,它会加速程序吗?当我开始询问我应该使用哪种类型来加速我的 C++ 程序时,我面临着我没有专业知识的更深层次的主题,并且一些解释似乎相互矛盾。你能解释一下吗:
1) 如果最佳做法是在 x64 中使用 long long 以实现最佳性能,即使是 1-4 字节数据?
2) 使用小于字长的类型的权衡(内存赢vs额外操作)
3) 字和整数大小为 64 位的 x64 计算机是否有可能通过所谓的向后兼容性使用 16 位字大小来处理短的?或者它必须将16位文件转换为64位文件,并且可以这样做的事实定义了系统向后兼容。
4) 我们可以强制编译器将 int 设为 64 位吗?
5) 如何将 ILP64 集成到使用 LP64 的 PC 中?
6) 使用适用于其他编译器、操作系统和架构(32 位处理器)的上述问题的代码可能会出现什么问题?
【问题讨论】:
-
永远不要依赖标准数据类型来获得特定的大小。 C++11 对此有 fixed-width integer types。 (在 C++11 之前有编译器特定的类型)
-
您可以拥有 512 位 CPU,而 16 位
int仍然 100% 符合标准。为什么有人会这样做,我无法理解,但它仍然是合法的。
标签: c++ performance memory 32bit-64bit word