应该使用size_t或ssize_t

hgy*_*bll 76 c++ unsigned signed size-t

在我的代码中,我不使用int或unsigned int.我只使用size_t或ssize_t进行移植.例如:

typedef size_t intc;    // (instead of unsigned int)
typedef ssize_t uintc;  // (instead of int)
Run Code Online (Sandbox Code Playgroud)

因为strlen,string,vector...全部使用size_t,所以我通常使用size_t.我只会ssize_t在它可能是负面时使用.

但我发现:

无符号整数类型非常适合将存储视为位数组的用途.使用无符号而不是int来再获得一位来表示正整数几乎不是一个好主意.通过声明无符号变量来确保某些值为正的尝试通常会被隐式转换规则所取代.

"C++编程语言 "一书中.

所以我很困惑.我错了吗?为什么STL不遵守书中的建议?

mad*_*tya 127

ssize_t用于返回值可以是有效大小的函数,也可以用于指示错误的负值.保证能够存储至少在该范围内的值[-1, SSIZE_MAX](SSIZE_MAX取决于系统).

因此,size_t无论何时返回大小(以字节为单位),以及ssize_t何时返回大小(以字节为单位)或(负)错误值,都应该使用.

请参阅:http: //pubs.opengroup.org/onlinepubs/007908775/xsh/systypes.h.html

  • 好吧,这个答案未能完全解释基于纯接口考虑因素做出此类决策的后果.对于`ssize_t`,任何实现都不可能使用比`size_t`更宽的类型.这立即意味着您将为返回负值的能力支付的价格是该类型正范围的*减半*.即`SSIZE_MAX`通常是`SIZE_MAX/2`.应该牢记这一点.在许多情况下,这个价格不值得支付能够将"-1"作为负值返回. (23认同)
  • @thesaint你在说什么?这不是关于容量.如果堆栈指针的当前值可能是否为负值,您将如何向堆栈指针添加四个? (8认同)
  • 由于硬件的原因,没有无符号整数*先*(在签名之前) - 显然这比大多数C++使用更接近裸机C但是使用MSB来允许签名算术不是为了减半"整数"可以表示的绝对量值,但因为需要减法数学.签名的int和未签名的int是梨和苹果 - 不同但能够在某些有限的情况下交叉......!(*每个范围的一半是共享的.*) (7认同)
  • @AnT完全没有符号值是C++中最大的失败之一.没有价格不值得付出的情况.如果你需要这么大的数字,请使用int64_t代替...... (5认同)
  • @josaphatv 什么?如果您不知道堆栈指针的值是否会溢出,如何将其加四?更不用说“向堆栈指针添加”整个短语与 C++ 无关。无符号值很糟糕,因为 1) 它们会导致各处的类型转换问题 2) 它们绝对没有任何好处 3) 它们甚至比有符号整数更不直观和可预测,因为它们已经在零处溢出。像“while(some_uint - 1 >= 0)”这样的表达式是错误的并且很难发现。有符号溢出的可能性要小得多。 (2认同)
  • 除此之外,你的说法完全没有意义。将数字添加到 int 或 uint 中只是是否溢出的问题。如果堆栈指针确实为负,那么您就会遇到不同的问题,哈哈。即使是这样,添加一些东西本质上也不会破坏任何东西。之前有东西坏了。你认为这比在 0x7FFFFFFF 上加 4 更糟糕,这超出了我的理解(它溢出到内核空间 => BOOM)。 (2认同)
  • @hgyxbll ssize_t 比 int 快是什么意思?ssize_t 可以是 int 或 long,它不是实际类型。我无法理解这一点,请解释一下。 (2认同)
  • 对于我来说,似乎出现混淆的情况是,当一个函数看起来它应该只产生一个无符号值时,即`read(2)`能够实际读取的字节数.然而,在出现错误的情况下,返回-1的值(可能编码为所有位设置) - 不是为了使事情变得困难,而是因为它是一个不能正常出现的**sentinel**值. (2认同)
  • 无符号类型的问题不在于它们的存在,而是它们被视为和处理为整数(因为根据数学定义,所有整数都是有符号的);这直接负责人们将它们视为签名类型,并扩展与它们相关的所有问题。无符号类型本质上更可预测(由于定义了溢出行为),但是很多人在检查它们时完全没有考虑到这一点,因为他们习惯于有符号计数器(IMO,这是教学的失败,当计数器不能小于 0)。 (2认同)
  • 无符号大小的支持者不明白两件事。一是,他们隐含地提倡无符号算术,这种算术在计算大小时完全被破坏(也在性能方面)。他们可能不理解的第二件事有点微妙(我承认对我来说很复杂),但这里有一个例子。在交通方面,他们总是给事件提供负的等待时间。在这种情况下,负等待时间并不是一个错误,而是一个类似于虚数的有用概念。顺便说一句,不确定,但是是否曾经讨论过簿记中的负数? (2认同)

use*_*267 28

ssize_t不包含在标准中,不可移植.size_t在处理对象大小时应该使用(ptrdiff_t对于指针差异也是如此).

  • ssize_t来自POSIX:http://pubs.opengroup.org/onlinepubs/009696799/basedefs/sys/types.h.html (8认同)