我在哪里可以找到size_t的定义?

时间:2009-07-13 13:14:10

标签: c++ c variables

我看到用这种类型定义的变量,但我不知道它来自何处,也不知道它的目的是什么。为什么不使用int或unsigned int? (其他“类似”类型怎么样?Void_t等。)

9 个答案:

答案 0 :(得分:111)

来自Wikipedia

  

stdlib.hstddef.h头文件定义了一个名为size_t 1的数据类型,用于表示对象的大小。采用大小的库函数期望它们的类型为size_t,而sizeof运算符的计算结果为size_t

     

size_t的实际类型取决于平台;一个常见的错误是假设size_t与unsigned int相同,这可能导致编程错误2,特别是当64位架构变得更加普遍时。

来自C99 7.17.1/2

  

标准标题stddef.h

中定义了以下类型和宏      

<剪断>

     

size_t

     

是sizeof运算符

的结果的无符号整数类型

答案 1 :(得分:24)

size_t是sizeof运算符结果的无符号整数类型(ISO C99第7.17节。)

sizeof运算符产生其操作数的大小(以字节为单位),可以是 表达式或类型的括号名称。大小由类型确定 操作数。结果是整数。结果的值是实现定义的,和 它的类型(无符号整数类型)是size_t(ISO C99第6.5.3.4节)。

答案 2 :(得分:22)

根据size_t description on en.cppreference.com size_t在以下标题中定义:

std::size_t

...    

Defined in header <cstddef>         
Defined in header <cstdio>      
Defined in header <cstring>         
Defined in header <ctime>       
Defined in header <cwchar>

答案 3 :(得分:4)

实际上,size_t表示您可以解决的字节数。在过去10到15年的大多数现代架构中,32位也是无符号整数的大小。但是我们正在转向64位寻址,而uint最有可能保持在32位(在c ++标准中不保证它的大小)。要使您的代码依赖于跨体系结构可移植的内存大小,您应该使用size_t。例如,数组大小之类的东西应该始终使用size_t。如果您查看标准容器,::size()始终会返回size_t

另请注意,visual studio有一个编译选项,可以检查这些类型的错误,称为“检测64位可移植性问题”。

答案 4 :(得分:2)

通过这种方式,您始终可以知道尺寸是多少,因为特定类型专用于尺寸。自己的问题表明它可能是一个问题:它是int还是unsigned int?此外,幅度是多少(shortintlong等等?)

因为指定了特定类型,所以您不必担心长度或签名。

实际定义可以在C++ Reference Library中找到,其中包含:

  

键入:size_t(无符号整数类型)

     

标题:<cstring>

     

size_t对应于语言运算符sizeof返回的整数数据类型,并在<cstring>头文件(以及其他文件)中定义为无符号整数类型。

     

<cstring>中,它在函数nummemchrmemcmpmemcpy中用作参数memmove的类型,memsetstrncatstrncmpstrncpystrxfrm,在所有情况下都用于指定函数的最大字节数或字符数影响。

     

它还用作strcspnstrlenstrspnstrxfrm的返回类型,以返回大小和长度。

答案 5 :(得分:2)

size_t应该在标准库的标题中定义。根据我的经验,它通常只是unsigned int的typedef。但重点是它不一定是这样。 像size_t这样的类型允许标准库供应商自由地更改其底层数据类型(如果适用于平台)。如果你假设size_t总是unsigned int(通过强制转换等),如果你的供应商将size_t改为例如,你可能会遇到问题。 64位类型。由于这个原因,假设有关此类或任何其他库类型的任何内容是危险的。

答案 6 :(得分:1)

我不熟悉void_t,除非是谷歌搜索(它在a vmalloc library by Kiem-Phong Vo at AT&T Research中使用 - 我确信它也在其他库中使用过。)

各种xxx_t typedef用于从特定的确定实现中抽象出类型,因为用于某些事物的具体类型可能因平台而异。例如:

  • size_t抽象用于保存对象大小的类型,因为在某些系统上,这将是32位值,而在其他系统上,它可能是16位或64位。
  • Void_t抽象vmalloc库例程返回的指针类型,因为它被编写为在早于ANSI / ISO C的系统上工作,其中void关键字可能不存在。至少那是我猜的。
  • wchar_t抽象出用于宽字符的类型,因为在某些系统上它将是16位类型,而在其他系统上它将是32位类型。

因此,如果您编写广泛的字符处理代码以使用wchar_t类型而不是unsigned short,则该代码可能更容易移植到各种平台。

答案 7 :(得分:1)

在简约程序中,size_t定义未在某些包含中“偶然”加载,但我仍然需要在某些上下文中(例如访问std::vector<double>),然后我使用 上下文提取正确的类型。例如typedef std::vector<double>::size_type size_t

(如果需要,可以使namespace {...}环绕以限制范围。)

答案 8 :(得分:1)

至于“为什么不使用int或unsigned int?”,只是因为它在语义上更有意义。有一个实际的原因,例如,它可以typedef作为int,然后升级到long,当然,没有任何人必须更改其代码,但更根本的是比那种类型应该是有意义的。为了大大简化,size_t类型的变量适用于包含事物大小的变量,并且用于包含事物的大小,就像time_t适合包含时间值一样。如何实际实现这些应该是实现的工作。与仅调用所有int相比,使用这样有意义的类型名称有助于澄清程序的含义和意图,就像任何丰富的类型集一样。