为什么 size_t 存在于 C/C++ 而 could/should 被替换?
Why size_t exists in C/C++ and could/should it be replaced?
我是一名电气工程师,现在是计算机科学家。我真的很难理解为什么在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
并退休其所有兄弟的优势???
std::size_t
是 unsigned
基本类型的 typedef,它应该能够表示程序中任何可能的 index/size(从技术上讲,它也是sizeof
运算符)。它的底层基本类型在不同的实现上可能会有所不同,并且因为您想要可移植性,所以您使用 std::size_t
并且不再关心它是 unsigned long int
还是 unsigned long long int
等
std::size_t
不使用任何无法以其他方式使用的功能,它只是一个方便的类型别名,仅此而已。
回应 OP 编辑
@HoapHumanoid 编辑对于 Whosebug 来说不是一个很好的问题,因为这是个人问题 interpretation/preference。当然你可以只有一种数字类型,或者 fixed-size 类型,但是当你想从你的处理器中榨取尽可能多的性能时,你最好有很多,每个都能够代表一个特定的范围,这取决于 物理 平台。由于计算机体系结构差异很大,因此每种体系结构都会强加自己的大小,例如int
、long
等。当你将这个问题与可移植性结合起来时,那么size_t
自然而然地出现了。您还会在通用函数中使用什么,例如是否保证在每个可能的实现 上分配尽可能多的内存?您会使用 int
来传递字节数吗?或者 long int
?您需要阅读编译器手册,检查适当的类型等,然后使用它。这就是 C++ 实现为您所做的,定义了适当的此类类型。
您忘记了 long long int
,大部分未签名的版本,uint8_t
和朋友,可能还有更多。 :-)
在某些语言中,整数类型的大小是固定的。 C++ 不是其中之一;为程序员提供了很大的灵活性,可以根据大小和范围平衡性能。
但是size_t
非常有用。它保证能够容纳任何对象的大小,或任何有效的数组索引。没有它会使编写可移植但高效的程序变得更加困难。
我是一名电气工程师,现在是计算机科学家。我真的很难理解为什么在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
并退休其所有兄弟的优势???
std::size_t
是 unsigned
基本类型的 typedef,它应该能够表示程序中任何可能的 index/size(从技术上讲,它也是sizeof
运算符)。它的底层基本类型在不同的实现上可能会有所不同,并且因为您想要可移植性,所以您使用 std::size_t
并且不再关心它是 unsigned long int
还是 unsigned long long int
等
std::size_t
不使用任何无法以其他方式使用的功能,它只是一个方便的类型别名,仅此而已。
回应 OP 编辑
@HoapHumanoid 编辑对于 Whosebug 来说不是一个很好的问题,因为这是个人问题 interpretation/preference。当然你可以只有一种数字类型,或者 fixed-size 类型,但是当你想从你的处理器中榨取尽可能多的性能时,你最好有很多,每个都能够代表一个特定的范围,这取决于 物理 平台。由于计算机体系结构差异很大,因此每种体系结构都会强加自己的大小,例如int
、long
等。当你将这个问题与可移植性结合起来时,那么size_t
自然而然地出现了。您还会在通用函数中使用什么,例如是否保证在每个可能的实现 上分配尽可能多的内存?您会使用 int
来传递字节数吗?或者 long int
?您需要阅读编译器手册,检查适当的类型等,然后使用它。这就是 C++ 实现为您所做的,定义了适当的此类类型。
您忘记了 long long int
,大部分未签名的版本,uint8_t
和朋友,可能还有更多。 :-)
在某些语言中,整数类型的大小是固定的。 C++ 不是其中之一;为程序员提供了很大的灵活性,可以根据大小和范围平衡性能。
但是size_t
非常有用。它保证能够容纳任何对象的大小,或任何有效的数组索引。没有它会使编写可移植但高效的程序变得更加困难。