c++ - 索引数组时我应该总是使用 size_t 吗?

标签 c++ c pointers virtual-memory size-t

我是否需要在索引数组时始终使用 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/

相关文章:

c++ - 如何正确删除C++中的指针?

c - c中的回文问题

c - 为什么被调用函数的指针不返回值给调用函数?

c - 仅在给定指针的情况下交换字符

c - 排序整数数组 C

c++ - 在单个排序调用 C++ 中对多个 vector 进行排序

c++ - 选择 vector vector 的大小

c++ - 如何将 QSizeGrip 放在 QDial 的右下角?

c - 加入路径时出现段错误

c - 定义的行为,将字符传递给 printf ("%02X"