我在哪里可以findsize_t的定义?
我看到用这种types定义的variables,但我不知道它来自哪里,也不知道它的目的是什么。 为什么不使用int或unsigned int? (其他“类似”types呢?Void_t等)。
从维基百科
stdlib.h
和stddef.h
头文件定义了一个名为size_t
1的数据types,用于表示对象的大小。 需要大小的库函数期望它们是size_t
types,并且sizeof运算符的计算结果是size_t
。
size_t
的实际types是平台相关的; 一个常见的错误是假定size_t
与unsigned int相同,这会导致编程错误,特别是在64位体系结构变得更普遍时。
从C99 7.17.1 / 2
以下types和macros在标准头
stddef.h
中定义<剪断>
size_t
这是sizeof运算符的结果的无符号整数types
size_t
是sizeof运算符(ISO C99第7.17节)的结果的无符号整数types。
sizeof
运算符产生其操作数的大小(以字节为单位),该操作数可以是一个expression式或一个types的括号内的名称。 大小取决于操作数的types。 结果是一个整数。 结果的值是实现定义的,其types(无符号整数types)是size_t
(ISO C99第6.5.3.4节)。
根据en.cppreference.com上的size_t描述 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>
实际上, size_t
代表你可以处理的字节数。 在过去10 – 15年的大多数现代体系结构中,32位也是无符号整数的大小。 但是,我们正在转向64位寻址,而uint
很可能会停留在32位(它的大小在c ++标准中是不能保证的)。 为了使你的代码依赖于跨体系结构的可移植内存,你应该使用size_t
。 例如,像数组大小应该总是使用size_t
的。 如果你看标准容器::size()
总是返回一个size_t
。
另外请注意,Visual Studio有一个编译选项,可以检查这些types的错误称为“检测64位可移植性问题”。
这样,你总是知道尺寸是多less,因为一个特定的types是专门用于尺寸。 自己的问题表明,这可能是一个问题:它是一个int
或一个unsigned int
? 此外,什么是规模( short
, int
, long
等)?
因为有一个特定的types分配,你不必担心长度或签名。
实际的定义可以在C ++ Reference Library中find ,其中说:
types:
size_t
(无符号整型)标题:
<cstring>
size_t
对应于由语言操作符sizeof
返回的整型数据types,并且在<cstring>
头文件(等等)中定义为无符号整型。在
<cstring>
,它被用作函数memchr
,memcmp
,memcpy
,memmove
,memset
,strncat
,strncmp
,strncpy
和strxfrm
中的参数num
的types,在所有情况下它都用来指定最大字节数或函数必须影响的字符。它也被用作
strcspn
,strlen
,strspn
和strxfrm
的返回types来返回大小和长度。
size_t应该在你的标准库的头文件中定义。 根据我的经验,它通常只是一个unsigned int的typedef。 但是,这一点不是必须的。 像size_t这样的types允许标准库供应商自由地改变其底层数据types(如果适合平台的话)。 如果您认为size_t始终是unsigned int(通过强制转换等),那么如果您的供应商将size_t更改为例如64位types,则可能会遇到问题。 由于这个原因,对这个或任何其他types的库进行假设是很危险的。
我不熟悉void_t
除了Googlesearch的结果(它在AT&T Research的Kiem-Phong Vo的vmalloc
库中使用 – 我确定它也用在其他库中)。
各种xxx_ttypes定义用于从特定的确定实现中抽象types,因为用于某些事物的具体types可能因平台而异。 例如:
- size_t抽象出用于保存对象大小的types,因为在某些系统上这将是一个32位的值,在其他系统上可能是16位或64位。
-
Void_t
抽象了由vmalloc
库例程返回的指针的types,因为它被写入可以在ANSI / ISO C之前的系统中工作,而void
关键字可能不存在。 至less这是我的猜测。 -
wchar_t
抽象为宽字符使用的types,因为在某些系统上它将是一个16位的types,在其他的系统上它将是一个32位的types。
所以,如果你编写你的宽字符处理代码来使用wchar_t
types而不是unsigned short
,那么这个代码可能会更容易移植到各种平台上。
在一些简单的程序中, size_t
定义在某些情况下是“偶然”加载的,但我仍然需要在某些上下文中(例如访问std::vector<double>
),然后使用该上下文来提取正确的types。 例如typedef std::vector<double>::size_type size_t
。
(如果需要,使用namespace {...}
环绕以限制作用域。)
至于“为什么不使用int或unsigned int?”,只是因为它在语义上不是更有意义。 有一个实际的原因,就是可以把typedef
作为一个int
,然后升级到long
以后,当然没有任何人需要修改它们的代码,但是更根本的是,types应该是有意义的。 为了大大简化, size_t
types的variables适合于和用于包含事物的大小,就像time_t
适合于包含时间值一样。 如何实现这些实际上应该是实现的工作。 与只调用int
相比,使用像这样有意义的types名称有助于澄清程序的含义和意图,就像任何丰富的types一样。