7

GCC 4.4.1、C99

我正在使用size_t,并且size_tunsigned int. 但是,这取决于您运行的是 32 位还是 64 位。

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

所以我不认为如果跨架构使用这将是非常可移植的。

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

4

7 回答 7

8

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

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

于 2009-11-08T16:59:12.090 回答
7

正如其他人所说,以字节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)另一端的缓冲区接收它是相当不安全的。

所有这些都是任何其他整数类型的标准问题,除了unsigned char. Sosize_t与任何其他整数类型一样可移植。

于 2009-11-08T17:16:00.133 回答
1

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

于 2009-11-08T16:40:13.673 回答
1

您还有 off_t 和 ptrdiff_t / ssize_t,它们在架构之间以相同的方式变化。

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

你永远不应该使用整数、长整数或其他任何东西。除此之外,long 的大小因平台而异(大多数 32 位系统上为 32 位,64 位 Unix 系统上为 64 位,64 位 Windows 上为 32 位)。

于 2009-11-08T16:46:50.837 回答
1

在这种情况下,很难弄清楚“便携式”是什么意思。术语“便携式”允许多种显着不同的解释。

size_t有一个非常具体的目的。它可以容纳给定实现中任何对象的大小。即它是一种始终可以接收sizeof运算符结果的类型。size_t没有其他用途,在其预期应用中,它是 100% 便携的,任何东西都可以便携。

您要问的是哪种“便携式”,再次不清楚。

于 2009-11-08T16:51:26.287 回答
0

取决于您使用 size_t 的目的。

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

另一方面,如果你用它作为一个通用的无符号整数来计算宇宙中的恒星数量,你可能会在 32 位系统上遇到问题(不确定 64 位系统)。

于 2009-11-08T16:46:04.660 回答
-2

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

就像普通的“int”在 64 位上可能就足够了,但在 32 位上可能会导致崩溃,因为它对于 32 位系统上的 int 来说太大了。

于 2009-11-08T16:28:48.213 回答