索引数组时应该始终使用 size_t 吗?

2024-05-01

我需要使用吗size_t总是在索引数组时即使数组没有大到超过 int 的大小?

这不是我应该什么时候使用的问题size_t。我只想知道,例如,一个程序是否具有 2GB 可用内存(所有这些字段都可以通过 int32 进行索引),但该内存(虚拟内存)分配给计算机的“字段”14GB - 16GB内存。

如果我使用int32代替size_t (or an unsigned long int) 在这种情况下?

也许问题更多的是关于虚拟内存而不是指针。


size_t是一个无符号整数,能够容纳可以分配的最大对象的大小。它对于索引很有用,因为这意味着它可以索引到您可以分配的最大数组。

这并不意味着索引需要甚至推荐它。您可以使用任何足够大的整数类型来索引数组。int_fast32_t可能会更快,uint_least16_t结构上可能更小,等等。了解您的数据,您就可以做出正确的选择。

您应该考虑的一个因素是,在某些平台上,使用带符号索引可能需要额外的符号扩展指令。作为示例,这里是 x86-64:

// ; zero-extending idx (in edx) is "free" by simply using rdx.
// movzx eax, BYTE PTR [rcx+rdx]
// ret
char get_index(char *ptr, unsigned idx)
{
   return ptr[idx];
}

// ; sign extending idx from 32 bits to 64 bits with movsx here.
// movsx rdx, edx     
// movzx eax, BYTE PTR [rcx+rdx]
// ret
char get_index(char *ptr, int idx)
{
   return ptr[idx];
}

虚拟内存超出了 C 或 C++ 的范围。从他们的角度来看,您只需索引到内存中,然后由您的平台使其工作。实际上,您的应用程序仅使用虚拟地址;你的CPU/操作系统正在幕后将虚拟地址转换为物理地址。这不是您需要担心的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

索引数组时应该始终使用 size_t 吗? 的相关文章

随机推荐