size_t可移植吗?

时间:2009-11-08 16:25:51

标签: c portability 32bit-64bit size-t

GCC 4.4.1,C99

我使用size_t,而size_tunsigned int。但是,这取决于您运行的是32位还是64位。

我将使用size_t来存储缓冲区的大小。

因此,如果跨架构使用,我认为这不会非常便携。

只是一个问题,在32位或64位上使用size_t。什么情况会导致最严重的问题?

8 个答案:

答案 0 :(得分:6)

size_t保证能够保存实现中任何对象的字节数。 这就是sizeof的返回类型为size_t的原因。

所以是的,它是便携式的。

答案 1 :(得分:4)

正如其他人所说的那样,size_t是正确的,并且完全可以接受sizeof()的结果或任何可表示对象的大小(以字节为单位)。您需要注意以下几点:

  1. size_t某些无符号整数类型的大小相同。它不一定与最大无符号整数类型unsigned intunsigned long等相同的字节数。
  2. sizeof(size_t)是一个实现定义的字节数,因此memcpy或分配给uintmax_t以外的任何整数类型都是个坏主意。我甚至不确定它是否可以安全地假设它的大小相等或小于uintmax_t
  3. 将一个size_t值写入二进制文件,然后通过另一个进程,另一台计算机或使用不同编译器选项编译的内容将其读回size_t,这可能会危害您的健康。
  4. 在网络上发送size_t值并尝试使用另一端的sizeof(size_t)缓冲区接收它是相当不安全的。
  5. 所有这些都是除unsigned char之外的任何其他整数类型的标准问题。所以size_t和其他整数类型一样可移植。

答案 2 :(得分:1)

如果使用malloc()或read(),则使用size_t或ssize_t作为缓冲区是有意义的。为了便于携带,请使用SIZE_MAX,SSIZE_MAX,sizeof(type-in​​-your-buffer)和%zd或%zu printf()。

答案 3 :(得分:1)

你也有off_t和ptrdiff_t / ssize_t,它们在架构之间以同样的方式变化。

如果您正确使用它们,那么它们可以跨架构移植。在32位系统上,它们都是32位宽,而在64位系统上,它们都是64位宽。这就是你想要的 - 在32位系统上,缓冲区的大小不可能大于32位size_t,但在64位系统上它可能要大得多。

你永远不应该使用整数,多头或其他任何东西。除此之外,长度的大小取决于平台(大多数32位系统为32位,64位Unix系统为64位,64位Windows为32位)。

答案 4 :(得分:1)

在这种情况下很难弄清楚“便携式”的含义。 “便携式”一词允许多种截然不同的解释。

类型size_t有一个非常特定的目的。它可以保存给定实现中任何对象的大小。即它是一种始终可以接收sizeof()运算符结果的类型。类型size_t没有其他目的,并且在其预期的应用程序中,它是100%便携式的,可以像任何东西一样便携。

你要问的是什么样的“便携式”,再一次,不清楚。

答案 5 :(得分:0)

您不应该假设size_t是无符号整数(see this answer),但我认为它在两种架构上具有相同的范围。

答案 6 :(得分:0)

取决于您使用size_t的内容。

如果您使用它来确定内存缓冲区的大小,那么它将是安全的,因为size_t足够大以解决任何计算机的整个内存。因此,如果内存缓冲区大于此值,则无论如何都会出现问题。

另一方面,如果您将它用作通用无符号整数来计算Universe中的星数,则可能在32位系统上存在问题(不确定64位系统)。 / p>

答案 7 :(得分:-2)

唯一真正严重的问题是尝试访问一个相当大的数组或一个大数字的size_t。

就像只有一个常规的“int”在64位上就足够了,但是可能会导致32位崩溃,因为它对于32位系统上的int来说太大了。