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

时间:2019-04-10 02:49:25

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

索引数组时是否需要始终使用size_t,即使该数组的大小不足以超过int的大小也是如此?

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

在这种情况下,如果我使用int32而不是size_t(或unsigned long int)来索引存储器,它将总是失败吗?

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

感谢您的回答。

2 个答案:

答案 0 :(得分:8)

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

这并不意味着索引是必需的甚至是推荐的索引。您可以使用任何足够大的整数类型来为数组建立索引。 int_fast32_t可能更快,uint_least16_t可能更小,依此类推。了解您的数据,就可以做出不错的选择。

虚拟内存不在C或C ++的范围内。从他们的角度来看,您只需索引到内存中,这取决于您的平台才能使其正常工作。实际上,您的应用仅使用虚拟地址;您的CPU / OS正在将虚拟地址转换为幕后的物理地址。不必担心。

答案 1 :(得分:0)

为了避免程序失败,程序员应始终使用至少与size()方法返回的类型一样大的索引类型。这样可以确保索引不会溢出数组的任何可能大小。数组的实现通常是确保其运行时大小不会溢出size_t方法返回的类型。这意味着索引类型应为:

  • char[N],如果是uint8_t[N]int[N]size_t
  • std::vector(对于std::listint
  • QList(对于QVectorsize()
  • 如果是位数组,则为任意精度整数(aint)(如果位数组的size()方法返回aint)
  • 如果数组在内存中被压缩,则为aint(如果数组的size()方法返回aint)
  • 如果数组跨越多台机器,则为aint(如果数组的int方法返回aint)
  • C ++以外的其他语言:
    • java.util.Collection(在size()及其子类的情况下

总结:安全索引类型是size()方法返回的类型。

注意:如果size_t方法返回无符号的int,则有符号的ssize_t-Wsign-compare不是安全的索引类型。对于gcc和clang,可以使用编译器标志-Wall(由-Wconversion启用)和{{1}}来防止大多数情况。