我有一个超过17,000 x 14,000的矩阵,我用C ++存储在内存中。这些值永远不会超过255所以我认为我应该将此矩阵存储为uint8_t类型而不是常规int类型。即使使用优化编译器,常规int类型是否将采用本机字大小(64位,每个单元8个字节)?我假设如果我将数组存储为uint8_t,我将减少8倍的内存?
答案 0 :(得分:3)
如果您对此表示怀疑,您可以尝试一下。
当然它会更小。
但是,它完全取决于您的使用模式,这将更快。轮廓!轮廓!简介!
意外性能考虑的原因:
答案 1 :(得分:2)
标准没有指定int
的确切大小,除了它至少是short
的大小。在某些64位体系结构(例如我使用的许多Linux和Solaris x86系统)上,int
为32位,long
为64位。每种类型的确切大小当然会因编译器/硬件而异。
找出答案的最佳方法是在您的系统上使用sizeof(int)
,看看它有多大。如果你有足够的RAM使用本机类型实际上可能比uint8_t
明显更快。
答案 2 :(得分:1)
即使是最好的优化编译器也不会对你放入矩阵的数据值进行分析并假设(在此拟人化)“嗯。他说int
但是一切都在0到255之间我打算把它变成uint8_t
。
编译器可以将某些关键字(例如register
和inline
)解释为建议而非命令。另一方面,类型是强制性的。您告诉编译器使用int
,因此编译器必须使用int
。因此切换到uint8_t
矩阵将为您节省大量内存。