我对size_t
的理解是,它足够大,可以保存您可能需要保留的任何(整数)值。 (也许这是一个糟糕的解释?)
例如,如果你使用类似for循环的东西迭代向量中的所有元素,size_t
通常是64位长(或者至少在我的系统上),以便它可以保存所有元素来自vector.size()的可能返回值。
或者至少,我认为这是正确的?
因此,有没有理由使用A而不是B:
答:for(uint64_t i = 0; i < v.size(); ++ i)
B:for(size_t i = 0; i < v.size(); ++ i)
如果我的解释错了,或者你有更好的解释,请随时编辑。
编辑:我应该补充一点,我的理解是size_t
的行为类似于普通的无符号整数 - 也许这是不正确的?
答案 0 :(得分:8)
size_t
是sizeof
的返回类型。
该标准表示它是某种无符号整数类型的typedef,并且大到足以容纳任何可能对象的大小。
但它没有强制要求它是uint64_t
(固定宽度64位无符号整数的typedef)更小,更大还是相同,在后一种情况下它是否是相同类型。< / p>
因此,在语义上正确使用size_t
。
与size()
的{{1}}一样(std::vector<T>
从使用的分配器中获取std::vector
,size_type
使用std::allocator<T>
。
答案 1 :(得分:5)
uint64_t保证为64位。如果你需要64位,你应该使用它。
size_t不保证是64位;它可能是未来机器中的128位。所以,关键字uint_64由它保留:)
答案 2 :(得分:3)
正确的案例是for(std::vector::size_type i ...
。
为了迭代向量或某种类型的东西,你很难找到size_t
不够大的情况,uint64_t
是,< / p>
当然,在32位机器上,size_t
通常是32位,但是你可能想要处理大于40亿的数字,这需要超过32位,这当然是一个用例uint64_t
。换句话说,uint64_t
保证为64位,size_t
不是所有机器/架构中的64位。
答案 3 :(得分:2)
std::size_t
被定义为无符号整数类型。它的长度取决于平台。 v.size()
将始终返回std::size_t
类型的值,因此选项B始终是正确的。
答案 4 :(得分:2)
不,size_t
绝对没有连接到&#34;持有任何你可能希望保持&#34;的整数值。你在哪里得到这个?
size_t
应该足够大,以保持给定实现中任何连续对象的字节大小。从概念上讲,这远远小于&#34;任何整数值&#34;。该语言不保证您可以创建占用整个可寻址存储的对象,这意味着size_t
在概念上甚至不足以容纳可寻址的内存字节数。
如果你想绑定&#34;任何整数值&#34;对于内存大小,适当的类型将是uintptr_t
,概念上大于size_t
。但我没有看到任何理由将任何整数值与#34;相关联。记忆特征。例如。即使uintptr_t
大于size_t
,也不能保证它足够大,以保持平台文件系统中最大文件的大小。
您可以使用size_t
迭代std::vector
元素的原因是该向量内部基于数组。数组是连续的对象,这就是为什么它们的大小由size_t
覆盖的原因。但是,一旦考虑到非连续容器,例如std::list
,size_t
就不再保证足以衡量或索引此类容器。
uint64_t
可以更容易地大于size_t
。但很可能你可能不得不使用不适合uint64_t
的整数值。