大矩阵的uint8_t和未指定的int之间的区别

时间:2011-09-30 15:10:47

标签: c++ memory

我有一个超过17,000 x 14,000的矩阵,我用C ++存储在内存中。这些值永远不会超过255所以我认为我应该将此矩阵存储为uint8_t类型而不是常规int类型。即使使用优化编译器,常规int类型是否将采用本机字大小(64位,每个单元8个字节)?我假设如果我将数组存储为uint8_t,我将减少8倍的内存?

3 个答案:

答案 0 :(得分:3)

如果您对此表示怀疑,您可以尝试一下。

当然它会更小。

但是,它完全取决于您的使用模式,这将更快。轮廓!轮廓!简介!

意外性能考虑的原因:

  • 对齐问题
  • 共享缓存行的元素(在顺序访问时可能是正数;在多核方案中可能是负数)
  • 增加了对原子读/写锁定的需求(在线程的情况下)
  • 降低了某些优化MIPS指令的适用性(? - 我不是最新的详细信息;也是一个非常好的优化编译器可能只是注册 - 分配正确大小的临时数据)
  • 其他无关的边界条件,源自周围的代码

答案 1 :(得分:2)

标准没有指定int的确切大小,除了它至少是short的大小。在某些64位体系结构(例如我使用的许多Linux和Solaris x86系统)上,int为32位,long为64位。每种类型的确切大小当然会因编译器/硬件而异。

找出答案的最佳方法是在您的系统上使用sizeof(int),看看它有多大。如果你有足够的RAM使用本机类型实际上可能比uint8_t明显更快。

答案 2 :(得分:1)

即使是最好的优化编译器也不会对你放入矩阵的数据值进行分析并假设(在此拟人化)“嗯。他说int但是一切都在0到255之间我打算把它变成uint8_t

编译器可以将某些关键字(例如registerinline)解释为建议而非命令。另一方面,类型是强制性的。您告诉编译器使用int,因此编译器必须使用int。因此切换到uint8_t矩阵将为您节省大量内存。