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


123

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



@kjfletch:嗯,很奇怪,搜索术语“ size_t”(就像我之前所做的那样)没有返回该问题。
Eliseo Ocampos,2009年

1
@Eliseo-Stackoverflow的搜索功能很糟糕。请改用带有“ site:stackoverflow.com”参数的Google。
Michael Burr

8
OP专门询问在哪里可以找到size_t的定义?我降落在这里寻找相同的东西。引用的dup没有讨论在哪里找到声明。
jww

9
这个问题显然和链接的问题不同。 “我在哪里找到东西”“两者之间有什么区别”(即使对一个问题的答案提供了对另一个问题的答案)则不同。我在Google上搜索“ c ++ where size_t定义在哪里”直接将我带到了这里,我会错过另一个问题,因为它是不同的
Dan Nissenbaum

Answers:


122

来自维基百科

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

的实际类型size_t取决于平台;一个常见的错误是假定size_t它与unsigned int相同,这可能会导致编程错误2,特别是在64位体系结构变得更加普遍的情况下。

C99 7.17.1 / 2起

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

<snip>

size_t

这是sizeof运算符结果的无符号整数类型


2
例如,Win64上,intunsigned int类型是32位,而为size_t为64位。
Michael Burr,2009年

7
请参阅ISO C(99)标准(C ++标准包括该标准)的第7.17和7.18.3节
Martin York

3
@LokiAstari为什么不知道答案在标准中的写法,为什么不编辑答案呢?
Hi-Angel

那么C ++的答案在哪里?
Lothar

@Lothar我认为唯一的区别是size_t可能是关键字,否则具有相同的含义。
Paul Stelian

30

根据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>

2
这正是我所需要的,应该对这个答案进行投票。
neodelphi

27

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

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


引用标准的最佳答案。
马丁·约克

1
@Martin-确实如此,但是我认为问题的“为什么不使用unsigned int用法”部分与“ what is t_t”部分一样有趣(或更多),并且您不会在标准中找到它。
Michael Burr,2009年

是的,除了没有“ 17.17节”:p。很少见,没有人说过关于Void_t的消息
Eliseo Ocampos 09年

我接受这个答案,因为它直接回答了这个问题,但是如果它与Michael的答案相辅相成,那就太好了。
Eliseo Ocampos 09年

58
可惜你的回答没有告诉我要包含什么头文件。
马特

6

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

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


2

这样,您就始终知道大小是多少,因为特定类型专用于大小。自己的问题表明这可能是一个问题:是一个int还是一个unsigned int?另外,幅度(shortintlong等)?

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

实际的定义可以在C ++参考库中找到,它说:

类型: size_t无符号整数类型)

标头: <cstring>

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

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

它也可以用来作为返回类型为strcspnstrlenstrspnstrxfrm对返回的尺寸和长度。


2

size_t应该在标准库的标头中定义。以我的经验,它通常只是unsigned int的typedef。关键是,它不一定必须如此。诸如size_t之类的类型允许标准库供应商自由地更改其基础数据类型(如果适用于平台)。如果您假设size_t始终是无符号int(通过转换等),那么如果您的供应商将size_t更改为例如64位类型,则将来可能会遇到问题。出于这个原因,假设任何有关此库类型或任何其他库类型的信息都是危险的。


1

void_t除了通过Google搜索(我在AT&T Research的Kiem-Phong Vo 图书馆中使用过搜索结果),我对此并不熟悉。vmalloc -我敢肯定,这在其他库中使用也一样)。

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

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

因此,如果您编写宽字符处理代码以使用wchar_t类型而不是使用该类型unsigned short,则该代码可能更适合于各种平台。


这是我一直在寻找的一部分。正如我在fpmurphy答案中的评论中所说,可以对此答案进行补充(如果您不介意,也许可以对其进行编辑),
那就太好了

1

在一些简约的程序中size_t,某些定义中没有“偶然”加载定义,但在某些上下文中(例如access std::vector<double>)仍需要它,那么我使用上下文提取正确的类型。例如typedef std::vector<double>::size_type size_t

namespace {...}如有必要,请将其包围以限制范围。)


1

至于“为什么不使用int或unsigned int?”,仅仅是因为它在语义上没有意义。实际的原因是,可以typedef先将其作为d int,然后再升级至long更高版本,而无需任何人更改代码,当然,但是从根本上说,类型应该有意义。为了大大简化,类型变量size_t适用于并用于包含事物的大小,就像time_t适用于包含时间值一样。如何实际实施这些应该是实施的工作。与仅调用所有内容相比int,使用像这样有意义的类型名有助于澄清程序的含义和意图,就像任何丰富的类型集一样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.