为什么C/C++中存在size_t,它是否应该被替换?

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

size_t 可以被替换吗?或者它有任何不可能以其他方式使用的功能吗?


[编辑]

在得到有益的答案后,仍有些事情没有完全看清楚。 size_t 在可移植性和性能方面都很有用,正如几位人士建议的那样。但是,有多么有用,是否有量化的方式或数值证据来衡量相对于只具有 int 并退役其所有“兄弟”???


本地类型(如intshort等)的存在部分是因为C语言有这些类型,而C++最初只是生成C代码的预处理器,另一部分是因为它使得编写“接近底层”的代码更容易。类型别名(如size_t)是为了使代码更易读,并更多地展示意图。使用size_t可以表明“这是一个大小”,因此更多地是为程序员而不是编译器的需要。 - Some programmer dude
2
可能是 unsigned int vs. size_t 或者其他 "related" 部分中的 size_t 问题的重复。 - Zeta
3
替换成什么? - Lightness Races in Orbit
1
int的兄弟之一是char,它是一个较小的整数类型。另一个是long long,至少有64位。似乎这两个都不能用任何大小的int合理地替换。你真的想通过将每个字符存储在8个字节中来增加字符字符串的体积吗?如果不是,你准备好说没有足够大的整数类型来保存你的内存大小,结果只能使用其中一部分来存储单个对象吗?得到的模型可能具有更少的移动部件,但我认为它们会更加麻烦。 - rici
3
@HoapHumanoid: 你需要给程序员提供一种表达需求的方式,对吗?这些需求可能是算法性的(即知道数字有多大),也可能是环境性的(例如在该平台上对象的大小;该平台上字符的大小)。C/C++ 提供了这两个选项,还提供了一些相对主观的选项(“较大”,“较小”等)。在底层,由于大多数定义都是别名,因此只有很少几种类型。但是这些别名让我能够直接表达我的需求,而不必研究我要使用的每个架构。 - rici
显示剩余4条评论
2个回答

16

std::size_t是一个无符号基本类型的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
1
@HoapHumanoid 是的,你可以这样做,但是 size_t 被定义为让每个人都知道它的存在并使用它。否则其他程序员就不会知道你的 wonderful_int。一个保证在所有平台上具有相同名称并且也保证存储任何可能的索引的类型在可移植性方面非常有用。例如,在我的机器上,我可能有 typedef unsigned long long size_t,而在你的机器上,你可能有 typedef unsigned long size_t。如果没有这个 typedef,你需要知道每个平台上的正确大小,这变得很麻烦。 - vsoftco
好的,如果我们不仅杀掉(退休呵呵)size_t,而且还杀掉它的所有表兄弟,只使用int会怎样?也许我应该在另一个问题中问这个。我要去做了。 - hoaphumanoid
好的,但我不是在谈论个人解释或偏好。很多人说你可以提高性能,但我正在寻求数值证据,比如基准测试或其他东西。您了解关于int和类似问题的这种证据吗? - hoaphumanoid
@HoapHumanoid 我没有这些基准测试的直接链接,但我相信它们是存在的。我不是计算机架构方面的专家,只是稍微了解一些相关问题。 - vsoftco
显示剩余2条评论

2
你忘记了long long int,大多数无符号版本,uint8_t和其他一些类型。:-)
在一些语言中,整数类型的大小是固定的。C++不是其中之一;程序员可以灵活地平衡性能与大小和范围。
但是size_t非常有用。它保证能够容纳任何对象的大小或任何有效数组索引。如果没有它,编写可移植且高效的程序将变得更加困难。

我知道有更多的方式来表达int,呵呵呵。关于你说的关于保持任何对象的大小,我们不能用其他9种整数类型中的任何一种吗? - hoaphumanoid
2
好的,unsigned int 在 64 位系统上可能太小了,而 unsigned long long 在 32 位系统上可能太大了。因此,在任何给定的系统上,至少其中一种类型会起作用,但具体哪种类型在不同的系统上会有所不同。 - Alan Stokes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接