此问题在此处已有答案:
Where do I find the definition of size_t, and what is it used for?(9个回答)
59分钟前关闭
在几个C++示例中,我看到使用了size_t
类型,而我本来应该使用简单的int
。有什么区别,为什么size_t
应该更好?
此问题在此处已有答案:
Where do I find the definition of size_t, and what is it used for?(9个回答)
59分钟前关闭
在几个C++示例中,我看到使用了size_t
类型,而我本来应该使用简单的int
。有什么区别,为什么size_t
应该更好?
5条答案
按热度按时间dkqlctbz1#
来自友好的维基百科:
stdlib. h和stddef. h头文件定义了一个名为size_t的数据类型,用于表示对象的大小。接受size的库函数期望它们是size_t类型,而sizeof运算符的计算结果是size_t。
size_t的实际类型与平台相关;一个常见的错误是假设size_t与unsigned int相同,这可能导致编程错误,特别是当64位架构变得更加流行时。
另外,检查Why size_t matters
7lrncoxx2#
size_t
**1)**是用于表示大小的数据类型(顾名思义),**2)是平台(甚至可能是实现)相关的,因此它应该 * 仅用于表示大小。表示大小,
size_t
自然是无符号的(你能有一个负3米宽的盒子吗?)许多stdlib
函数,包括malloc
,sizeof
和各种字符串操作函数都使用size_t
作为数据类型。默认情况下,
int
是有符号的,尽管它的大小也取决于平台,但在大多数现代机器上它将是固定的32位(尽管size_t
在任何64位架构上都是64位,但int
* 在这些相同的64位架构上保持 * 32位长)。摘要:使用
size_t
表示对象的大小,在其他情况下使用int
(或long
)。请注意,size_t
是无符号的,而int
和long
默认情况下都是有符号的(除非前缀为unsigned
,或修改为uint
或ulong
)。r6vfmomb3#
size_t
类型定义为sizeof
运算符的无符号整数类型。在真实的世界中,您经常会看到int
定义为32位(为了向后兼容),但size_t
定义为64位(因此您可以声明大小超过4 GiB的数组和结构)。如果long int
也是64位的,则称为LP 64约定;如果long int
是32位,而long long int
和指针是64位,那就是LLP 64。你也可能得到相反的结果,一个程序使用64位指令来提高速度,但使用32位指针来保存内存。此外,int
是有符号的,而size_t
是无符号的。历史上有许多其他平台的地址比
int
的原生大小更宽或更短。事实上,在70年代和80年代初,这种情况更为常见:所有流行的8位微计算机都具有8位寄存器和16位地址,16位和32位之间的转换也产生了许多地址比寄存器宽的机器。我偶尔还能在这里看到关于MS-DOS的Borland Turbo C的问题,它的巨大内存模式在16位CPU上以32位存储20位地址(但它可以支持80386的32位指令集);摩托罗拉68000有一个16位ALU,32位寄存器和地址; IBM的大型机有15位、24位或31位的地址,在嵌入式系统中,你仍然可以看到不同的ALU和地址总线大小。任何时候
int
小于size_t
,并且您试图将非常大的文件或对象的大小或偏移量存储在unsigned int
中,都有可能溢出并导致错误。对于int
,也有可能得到负数。如果int
或unsigned int
更宽,程序将正确运行,但会浪费内存。如果你想要可移植性,你应该使用正确的类型。很多人会建议你使用有符号数学而不是无符号数学(以避免像
1U < -3
这样的讨厌的,微妙的错误)。为此,标准库在<stddef.h>
中定义了ptrdiff_t
作为从另一个指针减去指针的结果的有符号类型。也就是说,一个解决方案可能是对
INT_MAX
和0
或INT_MIN
进行边界检查,并在比较有符号和无符号数量时打开编译器警告,以防您错过任何一个。无论如何,您应该始终始终检查C中的数组访问是否溢出。mrphzbgm4#
这是因为size_t可以是int以外的任何值(可能是结构体)。其思想是它从底层类型继承了它的工作。
ibrsph3r5#
SIZE_T
的定义见:https://msdn.microsoft.com/en-us/library/cc441980.aspx和https://msdn.microsoft.com/en-us/library/cc230394.aspx此处粘贴所需信息:
SIZE_T
是ULONG_PTR
,表示指针可以指向的最大字节数。此类型声明如下:
字符串
ULONG_PTR
是用于指针精度的无符号长类型。当将指针强制转换为长类型以执行指针算术时使用它。此类型声明如下:
型