【问题标题】:Does primitive array expects integer as index原始数组是否需要整数作为索引
【发布时间】:2015-11-08 15:23:17
【问题描述】:

是否应该通过 int 访问原始数组内容以获得最佳性能? 这是一个例子

int[] arr = new arr[]{1,2,3,4,5};

数组的长度只有5个元素,所以索引不必是int,而是short或byte,如果使用byte而不是int,这将节省无用的3字节内存分配。当然,如果我知道该数组不会溢出 255 的大小。

byte index = 1;
int value = arr[index];

但这真的像听起来那么好用吗?

我担心这是如何在较低级别执行的,索引是否被强制转换为 int 或其他实际上会减慢整个过程而不是优化它的操作。

【问题讨论】:

  • 您可能需要标记您使用的语言,以便人们可以更轻松地找到此帖子。

标签: c# c++ arrays indexing primitive


【解决方案1】:

索引是否被强制转换为 int 或其他实际上会减慢整个过程而不是优化它的操作

不,但是

这将节省无用的 3 字节内存分配

节省 3 个字节并没有任何好处。

只有当您存储这些索引的 巨大 数组时,您节省的空间量才可能成为值得投资的地方。

否则坚持使用普通的int,它是处理器的原生字长,因此是最快的。

【讨论】:

  • "节省 3 个字节并没有任何好处。"你怎么没有?您确实可以通过不在 L1 缓存中存储无用的 3 个字节来节省,并且在非常大的对象计数处理下会有所不同。
  • @UmNyobe 每个对象一个,但对象数非常大。问题更多不在于将使用此解决方案的项目或过早的优化。不管当前使用情况如何,我只想知道这一点。
【解决方案2】:

在 C 和 C++ 中,arr[index] 形式上等价于 *(arr + index)。您对强制转换的担忧应该可以回答一个更简单的问题,即当机器需要向指针添加整数偏移量时会做什么。

认为可以肯定地说,在大多数现代机器上,当您向指针添加“字节”时,它会使用与添加 32 位整数时相同的指令到一个指针。事实上,它仍然会使用机器字长来表示该字节,并用一些未使用的空间填充。所以这不会让使用数组更快。

如果您需要将数百万个这些索引存储在一个表中,那么您的优化可能会有所作为,然后使用 byte 而不是 int 会减少 4 倍的内存并花费更少的时间来移动该内存。如果您要索引的数组很大,并且索引需要大于机器字端,那么这是一个不同的考虑因素。但我认为可以肯定地说,在大多数正常情况下,这种优化并没有真正意义,并且 size_t 可能是数组索引最合适的泛型类型,所有事物都相等(因为它完全对应于机器字长,在大多数架构)。

【讨论】:

猜你喜欢
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多