具有std::allocator标准容器的size_type定义为std::size_t 。 然而,是否有可能有一个分配器的大小不能用size_t表示的对象? 换句话说, size_type是否可以比size_t ?
Bjarne Stroustrup在C ++编程语言中写道: 无符号整数types非常适合将存储器视为位数组的用途。 使用unsigned而不是int来获得更多的位来表示正整数几乎不是一个好主意。 尝试通过声明variables无符号来确保某些值是正值将通常被隐式转换规则所破坏。 size_t似乎是无符号的“以获得更多的位来表示正整数”。 那么这是一个错误(或权衡),如果是这样,我们应该尽量减less在我们自己的代码中使用它? Scott Meyers的另一篇相关文章就在这里 。 总之,他build议不要使用无符号的接口,不pipe值是否总是正值。 换句话说, 即使负值是没有意义的,你也不一定要使用无符号的。
在我的代码中,我不使用int或unsigned int。 我只使用size_t或ssize_t来进行移植。 例如: typedef size_t intc; // (instead of unsigned int) typedef ssize_t uintc; // (instead of int) 因为strlen , string , vector …都使用size_t ,所以我通常使用size_t 。 而且,只有当ssize_t可能是负数时才使用。 但是我发现: 无符号整数types非常适合将存储器视为位数组的用途。 使用unsigned而不是int来获得更多的位来表示正整数几乎不是一个好主意。 尝试通过声明variables无符号来确保某些值是正值将通常被隐式转换规则所破坏。 在“C ++编程语言 ”一书中。 所以我感到困惑。 我错了吗? 为什么STL不遵守书上的build议?
我想知道我的程序正在运行的系统上size_t的最大值。 我的第一本能是使用负1,就像这样: size_t max_size = (size_t)-1; 但我猜测有一个更好的方法,或者是一个常量定义的地方。
我只是想知道应该使用std::size_t循环和东西而不是int ? 例如: #include <cstdint> int main() { for (std::size_t i = 0; i < 10; ++i) { // std::size_t OK here? Or should I use, say, unsigned int instead? } } 一般来说,关于何时使用std::size_t的最佳做法是什么?
C标准保证size_t是一个可以容纳任何数组索引的types。 这意味着,在逻辑上, size_t应该能够保存任何指针types。 我在Google上发现的一些网站上说,这是合法的和/或应该始终工作: void *v = malloc(10); size_t s = (size_t) v; 那么在C99中,标准引入了intptr_t和uintptr_ttypes,它们是有符号和无符号types,保证能够保存指针: uintptr_t p = (size_t) v; 那么使用size_t和uintptr_t什么区别呢? 两者都是无符号的,都应该能够容纳任何指针types,所以它们在function上看起来是一样的。 除了清晰度之外,有没有真正有说服力的理由使用uintptr_t (或更好的是void * )而不是size_t ? 在一个不透明的结构中,这个领域只能由内部function来处理,是否有理由不这样做? 同样的道理, ptrdiff_t是一个能够保存指针差异的签名types,因此能够保存大多数指针,所以它与intptr_t有什么不同呢? 并不是所有这些types基本上服务于相同function的普通不同版本? 如果没有,为什么? 我不能用其中一个做我不能用另一个做的事情? 如果是这样的话,为什么C99在语言中增加了两个基本多余的types? 我愿意忽视函数指针,因为它们不适用于当前的问题,但随意提及它们,因为我怀疑它们是“正确”答案的核心。