【问题标题】:Why is the template-parameter for std::counting_semaphore<> a ptrdiff_t?为什么 std::counting_semaphore<> 的模板参数是 ptrdiff_t?
【发布时间】:2021-12-03 08:25:07
【问题描述】:

为什么 std::counting_semaphore&lt;&gt; 的模板参数是 ptrdiff_t 而不是 size_t ?对我来说,最大信号量计数值为负是没有意义的。

【问题讨论】:

  • size_t 在语义上不是计数,而是大小。此外,Herb、Bjarne(等人)都反复谈到使用无符号整数作为大小是一个错误。即使 语义上 可以使用无符号整数来表示诸如“大小”和“计数”之类的数字,它也会带来使用无符号整数的所有成本和混乱(定义明确的环绕) 与优化器友好的有符号整数相比。
  • @dfrib 添加一个来源,这就是答案。
  • std::ssize() open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1227r2.html 采用的提案包括指向其他​​类似提案的链接。
  • 恕我直言,使用->滥用。名称仍然脱离上下文且令人困惑。对此有一个合理的共识。
  • STL 已有 28 年历史,C++ 的许多默认设置都是错误的。 Read this paper by Bjarne himself

标签: c++ language-lawyer semaphore c++20


【解决方案1】:

size_t 在语义上不是计数,而是大小。此外,Herb、Bjarne(等人)都反复谈到 STL 中现有的无符号整数使用是如何开始的错误。即使 语义 使用无符号整数来表示诸如“大小”和“计数”之类的数字是有意义的,但它会带来使用无符号整数的所有成本和混淆(定义明确的环绕) 与优化器友好的有符号整数相比。

但请注意,这种讨论(Bjarne、Herb、Meyers 等人支持“未签名是一个错误”的观点)历来是社区中的一个分歧者。

参见例如Bjarne 的P1428R0下标和大小应签名):

问题

[...] 我将深入研究论点并考虑替代方案,但我的结论是:

  • 最初对 STL 使用 unsigned 是一个严重错误,应该(最终)更正

为什么我们在 STL 中有无符号下标

据我所知(STL 已有 25 年历史,所以我的记忆可能并不完全准确)给出了 STL 使用无符号类型作为下标的三个原因

  • [...]

基本上,我们在这三个方面都错了 [...]

跨度

[...] 这是一个开始努力将 STL 从其错误使用无符号下标的情况中转换出来的机会。

无符号大小

不幸的是,sizeof 产生一个无符号的(而且很难改变它),但我们不必对所有与大小有关的类型都遵循这一点。

正在进行一些活动(例如P1227R2:有符号的 ssize() 函数,无符号的 size() 函数)来慢慢纠正这种争论的“过去的错误”,尤其是不要盲目地使用新功能的争论同样错误。

【讨论】:

  • 与无符号整数没有混淆,有符号整数的优化机会很少,实际上无关紧要。
  • @BonitaMontero 这是一个非常有力的声明,我认为这是一个固执己见的声明。编译器可能假设没有未定义的行为程序,这意味着对于有符号整数,它可以假设永远不会下溢或上溢。然而,对于无符号整数,它不能做出这个假设。说这对于编译器的优化可能性“实际上无关紧要”是不正确的。 W.r.t. “没有混淆”,例如阅读P1428R0 中的 Problems with unsigned 部分。特殊的问题是混合有符号算法,实际上没有充分的理由让 unsigned 开始。
  • 只有当您使用 x + 1
  • @BonitaMontero:我指的是 “size_t 在语义上不是计数,而是大小。” 我只是指出这两个命名都是不正确的。然后它仍然只是签名/未签名的战争。
  • @BonitaMontero:“战争”,因为对于预期的大小符号没有共识。
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2012-11-19
相关资源
最近更新 更多