GCC 4.4.1、C99
我正在使用size_t
,并且size_t
是unsigned int
. 但是,这取决于您运行的是 32 位还是 64 位。
我将size_t
用来存储缓冲区的大小。
所以我不认为如果跨架构使用这将是非常可移植的。
只是一个问题,size_t
在 32 位或 64 位上使用。什么情况会导致最严重的问题?
GCC 4.4.1、C99
我正在使用size_t
,并且size_t
是unsigned int
. 但是,这取决于您运行的是 32 位还是 64 位。
我将size_t
用来存储缓冲区的大小。
所以我不认为如果跨架构使用这将是非常可移植的。
只是一个问题,size_t
在 32 位或 64 位上使用。什么情况会导致最严重的问题?
size_t
保证能够在您的实现中保存任何对象的字节数。这就是返回类型为的sizeof
原因size_t
。
所以是的,它是便携式的。
正如其他人所说,以字节size_t
为单位存储任何可表示对象的结果或大小是正确且完全可以接受的。sizeof()
您需要注意以下几点:
size_t
与某些无符号整数类型的大小相同。它不一定与最大的无符号整数类型 , 等具有相同的字节unsigned int
数unsigned long
。sizeof(size_t)
是实现定义的字节数,因此memcpy
将其分配或分配给除此之外的任何整数类型uintmax_t
都是一个坏主意。我什至不确定假设它的大小等于或小于uintmax_t
.size_t
读回可能对您的健康有害。size_t
size_t
值并尝试使用sizeof(size_t)
另一端的缓冲区接收它是相当不安全的。所有这些都是任何其他整数类型的标准问题,除了unsigned char
. Sosize_t
与任何其他整数类型一样可移植。
如果您使用 malloc() 或 read(),使用 size_t 或 ssize_t 作为缓冲区是有意义的。为了便于携带,请使用 SIZE_MAX、SSIZE_MAX、sizeof(type-in-your-buffer) 和 %zd 或 %zu printf()。
您还有 off_t 和 ptrdiff_t / ssize_t,它们在架构之间以相同的方式变化。
如果您正确使用它们,那么它们可以跨架构移植。在 32 位系统上,它们都是 32 位宽,而在 64 位系统上,它们都是 64 位宽。这就是您想要的 - 在 32 位系统上,缓冲区的大小不可能比 32 位 size_t 大,但在 64 位系统上它可以大得多。
你永远不应该使用整数、长整数或其他任何东西。除此之外,long 的大小因平台而异(大多数 32 位系统上为 32 位,64 位 Unix 系统上为 64 位,64 位 Windows 上为 32 位)。
在这种情况下,很难弄清楚“便携式”是什么意思。术语“便携式”允许多种显着不同的解释。
size_t
有一个非常具体的目的。它可以容纳给定实现中任何对象的大小。即它是一种始终可以接收sizeof
运算符结果的类型。size_t
没有其他用途,在其预期应用中,它是 100% 便携的,任何东西都可以便携。
您要问的是哪种“便携式”,再次不清楚。
取决于您使用 size_t 的目的。
如果您使用它来确定内存缓冲区的大小,它将是安全的,因为 size_t 大到足以寻址任何计算机的整个内存。因此,如果内存缓冲区大于此值,那么无论如何您都会遇到问题。
另一方面,如果你用它作为一个通用的无符号整数来计算宇宙中的恒星数量,你可能会在 32 位系统上遇到问题(不确定 64 位系统)。
唯一真正严重的问题是试图访问相当大的数组或 size_t 的大量数字。
就像普通的“int”在 64 位上可能就足够了,但在 32 位上可能会导致崩溃,因为它对于 32 位系统上的 int 来说太大了。