【问题标题】:Why size_t exists in C/C++ and could/should it be replaced?为什么 size_t 存在于 C/C++ 中并且可以/应该替换它?
【发布时间】:2016-01-01 19:50:02
【问题描述】:

我是一名电气工程师,后来转向计算机科学家。我真的很难理解为什么在 C++ 中有这么多几乎相同但不完全相同的东西。一个例子是short vs int vs unsigned int vs size_t vs long int vs long long int vs uint8_t(我不知道是否还有其他方法可以指定整数)。似乎它使语言变得不必要地复杂。

size_t 是否可以或应该被替换,或者它是否有任何无法以其他方式使用的功能?


[编辑]

在有用的答案之后,我仍然没有完全看到一些东西。正如一些人所建议的,size_t 在便携性和性能方面很有用。但是,有没有定量方法或数字证据来衡量与仅拥有int 并让所有兄弟退休的优势相比有多大帮助???

【问题讨论】:

  • native 类型(如intshort 等)之所以存在,部分原因是 C 有,而 C++ 最初只是生成 C 代码的预处理器,另一部分是因为它使编码“接近金属”要容易得多。类型别名(如size_t)是为了使代码更清晰,更能显示意图。使用size_t 你说“这是一个大小”,所以它更多地是为了程序员而不是编译器的需要。
  • unsigned int vs. size_t 的可能重复项,或“相关”部分中的任何其他 size_t 问题。
  • 替换为 .... 什么?
  • int 的兄弟之一是 char,它是一种较小的整数类型。另一种是long long,至少64位。似乎这些都不能用任何大小的 int 合理地替换。你真的想通过将每个字符存储在八个字节中来增加字符串吗?如果没有,您是否准备说没有足够大的整数类型来容纳您的内存大小,结果您只能将它的一小部分用于单个对象?生成的模型可能有更少的移动部件,但我会说移动它们会更烦人。
  • @HoapHumanoid:你需要给程序员一种表达需求的方式,不是吗?这些可能是算法的(即知道数字有多大)或者它们可能是环境的(即这个平台上对象的大小;这个平台上一个字符的大小)。 C/C++ 提供了这两种选择,以及一些主观的选择(“biggish”、“smallish”)。在幕后,只有少数类型,因为大多数定义都是别名。但是别名只是让我说出我需要的东西,而不是让我研究我将要使用的每一个架构。

标签: c++ c programming-languages typing size-t


【解决方案1】:

std::size_tunsigned 基本类型的typedef,它应该能够表示程序中任何可能的索引/大小(从技术上讲,它也是sizeof 运算符的结果)。它的底层基本类型在不同的实现中可能会有所不同,并且因为您想要可移植性,所以您使用std::size_t 并且不再关心它是unsigned long int 还是unsigned long long int 等。

std::size_t 没有使用任何无法以其他方式使用的功能,它只是一个方便的类型别名,仅此而已。

响应 OP 编辑​​

@HoapHumanoid 对于 StackOverflow 来说,编辑不是一个很好的问题,因为这是个人解释/偏好的问题。当然你可以只有一种数字类型,或者固定大小的类型,但是当你想从你的处理器中挤出尽可能多的性能时,你最好有很多,每个都能够代表一个特定的范围,具体取决于物理 平台。因为计算机体系结构有很大的不同,每个体系结构都会强加自己的大小,例如intlong 等。当您将此问题与可移植性结合起来时,size_t 就自然而然地出现了。您还会在通用函数中使用什么,例如是否保证在每个可能的实现上分配尽可能多的内存?您会使用int 传递字节数吗?或者long int?您需要阅读编译器手册,检查适当的类型等,然后使用它。这就是 C++ 实现为您所做的,定义了适当的此类类型。

【讨论】:

  • 但是我们可以然后使用 typedef 来定义类似 my_wonderful_int 的东西吗?并杀死 size_t??不杀它可怜的家伙,只是退休XDDD
  • @HoapHumanoid 是的,你可以,但是size_t 的定义是为了让每个人都知道它的存在并使用它。否则其他程序员不会知道你的wonderful_int。保证在所有平台上具有相同名称并保证存储任何可能的索引的类型在可移植性方面非常有用。例如,在我的机器上我可能有typedef unsigned long long size_t,而在你的机器上你可能有typedef unsigned long size_t。如果没有这个typedef,您需要知道每个平台上的正确尺寸,这会变得很痛苦。
  • 好的,如果我们杀死(退休呵呵)不仅size_t而且所有都是堂兄弟并且只使用int呢?也许我应该在另一个问题中问这个。我会做的
  • @HoapHumanoid 你会遇到严重的问题,因为int 可能不够大。然后你回到第一方,试图想出一个足够大的类型,并且在每个平台上都具有相同的名称。另一种选择是强制 C 和 C++ 对基本类型(如 Java)使用固定大小,但我敢打赌,由于各种原因,例如可移植性、性能、向后可移植性等,这不会发生。
  • vsoftco 我只是在我们正在讨论的内容之后编辑我的问题
【解决方案2】:

您忘记了long long int、大多数未签名版本、uint8_t 和朋友,可能还有更多。 :-)

在某些语言中,整数类型的大小是固定的。 C++ 不是其中之一。为程序员提供了很大的灵活性,以允许平衡性能与大小和范围。

但是size_t 非常有用。它保证能够保存任何对象的大小,或任何有效的数组索引。没有它会使编写可移植但高效的程序变得更加困难。

【讨论】:

  • 我知道还有更多的表达方式,呵呵。关于您所说的要容纳任何对象的大小。我们不能用其他 9 种整数中的任何一种来做到这一点吗??
  • 好吧,unsigned. int 在 64 位系统上可能太小,而unsigned long long 在 32 位系统上太大。因此,在任何给定系统上,至少有一种其他类型可以工作,但具体哪一种在不同系统上会有所不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 2016-09-06
  • 1970-01-01
相关资源
最近更新 更多