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

use*_*501 6 c++ integer vector size-t

我的理解size_t是它足够大以容纳你可能期望它保持的任何(整数)值.(也许这是一个糟糕的解释?)

例如,如果你使用像for循环这样的东西迭代向量中的所有元素,size_t通常会是64位长(或者至少在我的系统上),以便它可以保存来自vector.size的所有可能的返回值( ).

或者至少,我认为这是正确的?

因此,有没有理由使用A而不是B:

A: for(uint64_t i = 0; i < v.size(); ++ i)

B: for(size_t i = 0; i < v.size(); ++ i)

如果我的解释错了或者您有更好的解释,请随时编辑.

编辑:我应该补充一点,我的理解是size_t行为像普通的无符号整数 - 也许这是不正确的?

Ded*_*tor 8

size_t是回归类型sizeof.

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

因此,在语义正确的地方使用size_t.
就像size()a std::vector<T>(从使用的分配器std::vector获取它size_type,std::allocator<T>使用size_t).


amc*_*con 5

uint64_t保证为64位.如果你需要64位,你应该使用它.

size_t不保证是64位; 它可能是未来机器中的128位.所以,关键字uint_64由它保留:)


Mat*_*son 4

正确的情况是for(std::vector::size_type i ....

为了迭代向量或类似的东西,你将很难找到一个size_t不够大的情况,并且uint64_t是,

当然,在 32 位计算机上,size_t通常为 32 位,但您可能想要处理大于 40 亿的数字,这将需要超过 32 位,这当然是 fo 的一个用例uint64_t。换句话说,uint64_t保证是 64 位,size_t但并非所有机器/架构都是 64 位。