2009-07-13 66 views
94

我看到用这种类型定义的变量,但我不知道它来自哪里,也没有它的目的。为什么不使用int或unsigned int? (关于其他“类似”类型呢?Void_t等)。我在哪里可以找到size_t的定义?

+0

精确的问题:这很奇怪,搜索术语'size_t'是一个奇怪的问题:http://stackoverflow.com/questions/502856/whats-the-difference-between-sizet-and-int-in-c – kjfletch 2009-07-13 13:23:46

+0

@kjfletch:hhhmmm, (就像我之前所做的那样)并没有回到这个问题。 – 2009-07-13 13:40:10

+0

@Eliseo Ocampos,当你提出你的问题主题时,它没有出现?很奇怪。希望你得到你的答案。 – kjfletch 2009-07-13 13:42:36

回答

100

Wikipedia

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

size_t的实际类型是平台相关的;一个常见的错误是假定size_t与无符号整数相同,这可能导致编程错误,特别是在64位体系结构变得更普遍时,特别是2

C99 7.17.1/2

以下类型和宏在标准报头中定义stddef.h

<剪断>

size_t

其的无符号整数型t的结果他sizeof运营商

2

这样你总是知道尺寸是什么,因为一个特定的类型是专门用于尺寸。自己的问题表明它可能是一个问题:是int还是unsigned int?另外,什么是数量级(short,int,long等)?

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

实际的定义可以在C++ Reference Library中找到,它说:

类型:size_t(无符号整型)

部首:<cstring>

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

<cstring>,它在功能memchrmemcmpmemcpymemmovememsetstrncatstrncmpstrncpystrxfrm,其在所有情况下它是用来指定的最大数量被用作参数num的类型该函数必须影响的字节或字符。

它也被用作返回类型strcspn,strlen,strspnstrxfrm返回大小和长度。

2

size_t应该在标准库的头文件中定义。根据我的经验,它通常只是一个unsigned int的typedef。但是,这一点不是必须的。 像size_t这样的类型允许标准库供应商可以自由更改其底层数据类型(如果适用于该平台的话)。如果您认为size_t始终是unsigned int(通过强制转换等),那么如果您的供应商将size_t更改为例如,您可能会遇到问题。一个64位的类型。由于这个原因,对这个或任何其他库类型进行假设是很危险的。

21

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

sizeof操作者产生其操作数的大小(以字节为单位),其可以是 表达或一个类型的加括号的名字。大小由操作数的类型 决定。结果是一个整数。结果的值是实现代网络定义,和 其类型(无符号整数类型)是size_t(ISO C99第6.5.3.4。)

4

实事求是地讲size_t代表你可以解决的字节数。在过去的10 - 15年中,大多数现代体系结构都是32位,这也是无符号整数的大小。然而,我们正在转向64位寻址,而uint很可能会保持在32位(它的大小在C++标准中是不能保证的)。为了使你的代码依赖于跨体系结构的可移植内存,你应该使用size_t。例如,数组大小应始终使用size_t's。如果您查看标准容器,::size()总是会返回size_t

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

1

我对void_t不熟悉,除非是Google搜索的结果(它在a vmalloc library by Kiem-Phong Vo at AT&T Research中使用 - 我确定它也用于其他库)。

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

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

所以,如果你写你的宽字符处理代码使用wchar_t类型,而不是,说unsigned short,该代码想必会更容易移植到不同的平台。

15

根据size_t description on en.cppreference.comsize_t在下面的头文件中定义:

std::size_t 

...  

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

在一个size_t定义是不是“偶然”装简约方案,一些包括但我仍然需要它在某些情况下(例如访问std::vector<double>),然后我用上下文来提取正确的类型。例如typedef std::vector<double>::size_type size_t

(环绕声与namespace {...}如果必要的话,使空间有限。)

1

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

相关问题