大型矩阵的uint8_t和未指定int之间的差异 我有一个超过17000×14000的矩阵,我在C++中存储在内存中。这些值永远不会超过255,因此我认为应该将该矩阵存储为uint8\u t类型,而不是常规的int类型。即使使用优化编译器,常规int类型是否也会采用本机字大小(64位,每个单元格8字节)?我假设如果我将数组存储为uint8\u t?

大型矩阵的uint8_t和未指定int之间的差异 我有一个超过17000×14000的矩阵,我在C++中存储在内存中。这些值永远不会超过255,因此我认为应该将该矩阵存储为uint8\u t类型,而不是常规的int类型。即使使用优化编译器,常规int类型是否也会采用本机字大小(64位,每个单元格8字节)?我假设如果我将数组存储为uint8\u t?,c++,memory,C++,Memory,标准没有指定int的确切大小,但至少是short的大小。在一些64位体系结构上(例如我使用的许多Linux和Solaris x86系统)int是32位,long是64位。当然,每种类型的确切大小因编译器/硬件而异 最好的方法是在您的系统上使用sizeof(int),看看它有多大。如果您有足够的内存,那么使用本机类型的内存实际上可能比uint8\u t快得多,标准没有指定int的确切大小,只是它至少是short的大小。在一些64位体系结构上(例如我使用的许多Linux和Solaris x86系统)

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


最好的方法是在您的系统上使用
sizeof(int)
,看看它有多大。如果您有足够的内存,那么使用本机类型的内存实际上可能比
uint8\u t

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


最好的方法是在您的系统上使用
sizeof(int)
,看看它有多大。如果您有足够的RAM,那么使用本机类型实际上可能比
uint8\t
快得多。如果您对此表示怀疑,您可以尝试一下

当然会小一些

但是,这完全取决于您的使用模式,您的使用模式将更快。轮廓轮廓个人资料

意外性能注意事项的原因:

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

    • 如果您对此有疑问,您可以尝试一下

      当然会小一些

      但是,这完全取决于您的使用模式,您的使用模式将更快。轮廓轮廓个人资料

      意外性能注意事项的原因:

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

      即使是最好的优化编译器也不会对你放入矩阵并假设(此处拟人化)的数据值进行分析。“嗯。他说
      int
      ,但所有值都在0到255之间。我将把它做成一个
      uint8\t
      数组。”


      编译器可以将一些关键字(如
      register
      inline
      )解释为建议而不是命令。另一方面,类型是委托书。您告诉编译器使用
      int
      ,因此编译器必须使用
      int
      。因此,切换到
      uint8\t
      矩阵将为您节省大量内存。

      即使是最好的优化编译器也不会对您放入矩阵并假设的数据值进行分析(此处拟人化)“嗯,他说的是
      int
      ,但所有的值都在0到255之间。我将把它做成一个
      uint8\u t
      数组


      编译器可以将一些关键字(如
      register
      inline
      )解释为建议而不是命令。另一方面,类型是命令。您告诉编译器使用
      int
      ,因此编译器必须使用
      int
      。因此切换到
      uint8\t
      矩阵将为您节省大量的时间我在这里。

      不,
      long
      是32,
      long
      在x86和amd64上都是64。@wormsparty:在我的系统(x86\u 64 Linux)上,
      long
      是64位。我很确定Mark B关于“大多数”64位平台的说法是正确的。@wormsparty:你能澄清一下“long是32”在。。。amd64?这不是真正的“架构”问题,因为在同一架构上有多个ABI,所以即使在同一CPU上,它也会因操作系统而异。无论如何,你的一个例子不能反驳“大多数”的说法“64位体系结构有一个特殊的属性,64位Windows是Mark声称的少数群体中的一员。@wormsparty。它们是由操作系统定义的,Mark B的答案对于大多数Unix/Linux和Mac系统都是正确的。在今天和未来十年的任何机器上,即使
      int
      uint8\u t
      快,
      uint8\u t[14000][17000]
      也会比
      int[14000][17000]快。甚至以相当大的幅度。在所有缓存级别上浪费这么多位是没有好处的。不,
      long
      是32,
      long
      在x86和amd64上都是64位。@wormsparty:在我的系统(x86_64 Linux Linux)上,
      long
      是64位。我很确定Mark B关于“大多数”64位平台的说法是正确的。@wormsparty:你能澄清一下“long is 32 on…amd64”是什么意思吗?这不是一个真正的“架构”问题,因为同一架构上有多个ABI,所以即使在同一CPU上,它也会因操作系统而异。无论如何,你的一个例子不能反驳“大多数”64的说法