C++:是否有理由使用uint64_t而不是size_t
C++: Is there any reason to use uint64_t instead of 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
的行为就像一个普通的无符号整数——也许这是不对的?
uint64_t保证为64位。如果你需要64位,你应该使用它。
size_t不能保证是64位;在未来的机器中可能是128位。因此,关键字uint_64被保留:)
size_t
是sizeof
的返回类型。
标准规定它是某种无符号整数类型的typedef,并且足够大,可以容纳任何可能对象的大小
但它并没有规定它是更小、更大还是与uint64_t
(固定宽度64位无符号整数的typedef)相同的大小,也没有规定在后一种情况下它是否是相同的类型。
因此,在语义正确的地方使用size_t
类似于std::vector<T>
的size()
(std::vector
从使用的分配器中获得size_type
,std::allocator<T>
使用size_t
)。
正确的情况是for(std::vector::size_type i ...
。
为了迭代一个向量或类似的东西,你很难找到size_t
不够大,而uint64_t
是的情况
当然,在32位机器上,size_t
通常是32位,但您可能希望处理大于40亿的数字,这将需要超过32位,这当然是uint64_t
的一个用例。换句话说,在所有机器/体系结构中,uint64_t
被保证为64位,size_t
不是64位。
否,size_t
与"持有任何您可能期望它持有的整数值"完全没有联系。你从哪里得到的?
CCD_ 24应该足够大以容纳给定实现中任何连续对象的字节大小。从概念上讲,这远远小于"任何整数值"。该语言不能保证您可以创建占用整个可寻址存储的对象,这意味着size_t
在概念上甚至不足以容纳可寻址字节的内存。
如果您想将"任何整数值"与内存大小联系起来,那么合适的类型应该是uintptr_t
,它在概念上大于size_t
。但我看不出有任何理由将"任何整数值"与内存特性联系起来。例如,即使uintptr_t
大于size_t
,也不能保证它足够大,可以容纳平台文件系统中最大文件的大小。
之所以可以使用size_t
来迭代std::vector
的元素,是因为向量在内部基于数组。数组是连续的对象,这就是size_t
覆盖数组大小的原因。但是,一旦考虑到像std::list
这样的非连续容器,就不能再保证size_t
足以测量或索引这些容器。
CCD_ 35可以更容易地大于CCD_ 36。但是,您可能不得不使用不适合uint64_t
的整数值。
std::size_t
定义为无符号整数类型。它的长度取决于平台。v.size()
将始终返回类型为std::size_t
的值,因此选项B始终是正确的。
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么(-1)%vector::size()总是返回0
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- vector.size() 在比较中意外工作
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 为什么"(!v.empty())"比"(v.size() >0)"好?
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- std::string.size() 未知行为
- 为什么gmp会在这里与"invalid next size"重新定位一起崩溃?
- 为什么我会"Invalid read of size 8"?(瓦尔格林德)
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 使用 std::size 来自非 const 上下文
- "fast"或"normal"在"free(): invalid next size (fast)"中是什么意思?
- 关于uint64的atomic_fetch_add的奇怪行为