我在哪里可以findsize_t的定义?

我看到用这种types定义的variables,但我不知道它来自哪里,也不知道它的目的是什么。 为什么不使用int或unsigned int? (其他“类似”types呢?Void_t等)。

从维基百科

stdlib.hstddef.h头文件定义了一个名为size_t 1的数据types,用于表示对象的大小。 需要大小的库函数期望它们是size_ttypes,并且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 ? 此外,什么是规模( shortintlong等)?

因为有一个特定的types分配,你不必担心长度或签名。

实际的定义可以在C ++ Reference Library中find ,其中说:

types: size_t (无符号整型)

标题: <cstring>

size_t对应于由语言操作符sizeof返回的整型数据types,并且在<cstring>头文件(等等)中定义为无符号整型。

<cstring> ,它被用作函数memchrmemcmpmemcpymemmovememsetstrncatstrncmpstrncpystrxfrm中的参数num的types,在所有情况下它都用来指定最大字节数或函数必须影响的字符。

它也被用作strcspnstrlenstrspnstrxfrm的返回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_ttypes而不是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_ttypes的variables适合于和用于包含事物的大小,就像time_t适合于包含时间值一样。 如何实现这些实际上应该是实现的工作。 与只调用int相比,使用像这样有意义的types名称有助于澄清程序的含义和意图,就像任何丰富的types一样。