索引数组时是否需要始终使用size_t
,即使该数组的大小不足以超过int的大小也是如此?
我何时应该使用size_t
并不是问题。我只想知道,例如,一个程序是否具有2GB的可用内存(所有这些字段都可以由int32索引),但是此内存(虚拟内存)分配给了“字段” 14GB-计算机的16GB RAM。
在这种情况下,如果我使用int32
而不是size_t
(或unsigned long int
)来索引存储器,它将总是失败吗?
也许问题更多是关于虚拟内存,而不是指针。
感谢您的回答。
答案 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::list
和int
QList
(对于QVector
和size()
size()
方法返回aint)size()
方法返回aint)int
方法返回aint)java.util.Collection
(在size()
及其子类的情况下总结:安全索引类型是size()
方法返回的类型。
注意:如果size_t
方法返回无符号的int
,则有符号的ssize_t
和-Wsign-compare
不是安全的索引类型。对于gcc和clang,可以使用编译器标志-Wall
(由-Wconversion
启用)和{{1}}来防止大多数情况。