我是否需要在索引数组时始终使用 size_t
,即使数组的大小不足以超过 int 的大小?
这不是我应该何时使用 size_t
的问题。我只想知道,例如,一个程序是否有 2GB 的可用内存(所有这些字段都可以用 int32 索引)但是这个内存是(虚拟内存)分配给计算机的 14GB - 16GB 的“字段”内存。
如果我使用 int32
而不是 size_t
(或 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/OS 正在将虚拟地址转换为幕后的物理地址。这不是您需要担心的事情。
关于c++ - 索引数组时我应该总是使用 size_t 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55604029/