C ++:有没有理由使用uint64_t而不是size_t

时间:2015-02-23 23:34:17

标签: c++ vector integer size-t

我对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的行为类似于普通的无符号整数 - 也许这是不正确的?

5 个答案:

答案 0 :(得分:8)

size_tsizeof的返回类型。

该标准表示它是某种无符号整数类型的typedef,并且大到足以容纳任何可能对象的大小。
但它没有强制要求它是uint64_t(固定宽度64位无符号整数的typedef)更小,更大还是相同,在后一种情况下它是否是相同类型。< / p>

因此,在语义上正确使用size_t
size()的{​​{1}}一样(std::vector<T>从使用的分配器中获取std::vectorsize_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::listsize_t就不再保证足以衡量或索引此类容器。

uint64_t可以更容易地大于size_t。但很可能你可能不得不使用不适合uint64_t的整数值。