我看到用这种类型定义的变量,但我不知道它来自哪里,也没有它的目的。为什么不使用int或unsigned int? (关于其他“类似”类型呢?Void_t等)。我在哪里可以找到size_t的定义?
回答
这样你总是知道尺寸是什么,因为一个特定的类型是专门用于尺寸。自己的问题表明它可能是一个问题:是int
还是unsigned int
?另外,什么是数量级(short
,int
,long
等)?
因为有一个特定的类型分配,你不必担心长度或签名。
实际的定义可以在C++ Reference Library中找到,它说:
类型:
size_t
(无符号整型)部首:
<cstring>
size_t
对应于返回的积分数据类型由语言运算符sizeof
定义,并在<cstring>
头文件(等等)中定义为无符号整型。在
<cstring>
,它在功能memchr
,memcmp
,memcpy
,memmove
,memset
,strncat
,strncmp
,strncpy
和strxfrm
,其在所有情况下它是用来指定的最大数量被用作参数num
的类型该函数必须影响的字节或字符。它也被用作返回类型
strcspn
,strlen
,strspn
和strxfrm
返回大小和长度。
size_t应该在标准库的头文件中定义。根据我的经验,它通常只是一个unsigned int的typedef。但是,这一点不是必须的。 像size_t这样的类型允许标准库供应商可以自由更改其底层数据类型(如果适用于该平台的话)。如果您认为size_t始终是unsigned int(通过强制转换等),那么如果您的供应商将size_t更改为例如,您可能会遇到问题。一个64位的类型。由于这个原因,对这个或任何其他库类型进行假设是很危险的。
size_t
是无符号整数类型sizeof操作符的结果(ISO C99第7.17。)
的sizeof
操作者产生其操作数的大小(以字节为单位),其可以是 表达或一个类型的加括号的名字。大小由操作数的类型 决定。结果是一个整数。结果的值是实现代网络定义,和 其类型(无符号整数类型)是size_t
(ISO C99第6.5.3.4。)
实事求是地讲size_t
代表你可以解决的字节数。在过去的10 - 15年中,大多数现代体系结构都是32位,这也是无符号整数的大小。然而,我们正在转向64位寻址,而uint
很可能会保持在32位(它的大小在C++标准中是不能保证的)。为了使你的代码依赖于跨体系结构的可移植内存,你应该使用size_t
。例如,数组大小应始终使用size_t
's。如果您查看标准容器,::size()
总是会返回size_t
。
另请注意,Visual Studio有一个编译选项,可以检查这些类型的错误称为“检测64位可移植性问题”。
我对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
,该代码想必会更容易移植到不同的平台。
根据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>
在一个size_t
定义是不是“偶然”装简约方案,一些包括但我仍然需要它在某些情况下(例如访问std::vector<double>
),然后我用即上下文来提取正确的类型。例如typedef std::vector<double>::size_type size_t
。
(环绕声与namespace {...}
如果必要的话,使空间有限。)
至于“为什么不使用int或unsigned int?”,只是因为这是语义上更有意义都不到。有一个实际的原因,它可以是typedef
d作为int
,然后升级到long
,当然没有任何人需要改变他们的代码,但是更重要的是比一个类型应该是有意义的。为了大大简化,size_t
类型的变量适用于并用于包含事物的大小,就像time_t
适合包含时间值一样。如何实现这些实际应该是实现的工作。与仅仅调用所有内容int
相比,使用像这样有意义的类型名称有助于澄清程序的含义和意图,就像任何丰富的类型一样。
- 1. 哪里可以找到CeCreateDatabaseWithProps的定义
- 2. 哪里可以找到Theme_Material_Light的定义?
- 3. 我在哪里可以找到spatstat中类对象的定义
- 4. 我在哪里可以找到“eslint:recommended”的规则定义?
- 5. 我在哪里可以找到Xcode术语和定义?
- 6. 我在哪里可以找到“自定义开/关”选项?
- 7. 我在哪里可以找到PDFMiner API定义?
- 8. EDI X12标准 - 我在哪里可以找到这个定义?
- 9. 我在哪里可以找到的UIKit
- 10. 我在哪里可以找到16F877A.h?
- 11. 我在哪里可以找到PyBluez API
- 12. 我在哪里可以找到Microsoft.Build.Utilities.v3.5
- 13. 我在哪里可以找到PHPUnit_Extensions_SeleniumTestCase?
- 14. 我在哪里可以找到compojure.html?
- 15. User.find_for_oauth - 我可以在哪里找到它?
- 16. 我在哪里可以找到com.mathworks.jmi包
- 17. 我在哪里可以找到Python类?
- 18. 我在哪里可以找到android-server.apk?
- 19. 我在哪里可以找到org.restlet.android.jar?
- 20. 我在哪里可以找到dict_keys类?
- 21. 我在哪里可以找到System.Linq.Dynamic dll?
- 22. 我在哪里可以找到InlinePageParser类?
- 23. 我在哪里可以找到ConnectivityMonitor()?
- 24. 我在哪里可以找到包org.omg.CosTransactions
- 25. 我在哪里可以找到.NET v1.0.5000.0?
- 26. 我在哪里可以找到$脚本?
- 27. 我在哪里可以找到ExpressionParseHelper?
- 28. 我在哪里可以找到ServerConnection类?
- 29. 我在哪里可以找到@ Html.FacebookSignedRequest()
- 30. 我在哪里可以找到Base64Encoder类?
精确的问题:这很奇怪,搜索术语'size_t'是一个奇怪的问题:http://stackoverflow.com/questions/502856/whats-the-difference-between-sizet-and-int-in-c – kjfletch 2009-07-13 13:23:46
@kjfletch:hhhmmm, (就像我之前所做的那样)并没有回到这个问题。 – 2009-07-13 13:40:10
@Eliseo Ocampos,当你提出你的问题主题时,它没有出现?很奇怪。希望你得到你的答案。 – kjfletch 2009-07-13 13:42:36