是size_t编译代码的机器的字大小?
用g ++解析,我的编译器视图size_t为long unsigned int.在编译器被调用之前,编译器是否在内部选择某个预处理器宏的大小size_t,或者size_t实际上是stddef.h在字大小内设置的?
还是我偏离轨道?
Pet*_*ker 21
在C++标准中,[support.types](18.2)/ 6:"类型size_t是一个实现定义的无符号整数类型,它足够大,可以包含任何对象的字节大小."
无论这意味着什么,这可能与"字大小"相同或不同.
Jon*_*ler 12
没有; size_t不一定是运行代码的机器的"字大小"(在交叉编译的情况下)或编译代码(在正常情况下代码将在同一类型的机器上运行)的意思编译代码).它是一个无符号整数类型,足以容纳实现可以分配的最大对象的大小(以字节为单位).
sizeof和size_t我不知道什么时候size_t被引入,但它是在1979年到1989年之间.第一版K&R 1978年的C程序设计语言没有提及size_t.第7版Unix程序员手册根本没有提及size_t,而且可以追溯到1979年.来自1984年的Kernighan和Pike的"UNIX编程环境"一书中没有提到size_t索引(也没有,malloc()或者free(),有点令我惊讶) ,但这只是指示性的,而不是决定性的.C89标准肯定有size_t.
C99理由记录了一些关于sizeof()和的信息size_t:
6.5.3.4 sizeof运算符
这是的功能,如正确使用方法基本
malloc和fread这sizeof(char)正好一个.实际上,这意味着C语言中的字节是最小的存储单位,即使该单位是36位宽; 并且所有对象都由这些最小单元的整数组成.如果内存可位寻址,也适用.与K&R一样,C89将sizeof运算符的结果定义为无符号整数类型的常量.常见的实现和常见用法通常假设结果类型是int.依赖于此行为的旧代码从未可移植到将结果定义为其他类型的实现int.C89委员会认为改变语言以保护错误代码并不合适.
sizeof无论它是什么类型,都会被发布(在库头中<stddef.h>)size_t,因为程序员能够引用这种类型是有用的.此要求隐式地限制size_t为现有无符号整数类型的同义词.另请注意,尽管size_t是无符号类型,sizeof但如果大小太大而无法表示为a ,则不会涉及任何会导致模数行为的算术运算或转换size_t,从而消除 了最大可声明对象可能太大而无法跨越的任何概念即使是unsigned longC89或uintmax_tC99.这也限制了可以在阵列中声明的元素的最大数量,因为对于任何数组a的N元素,
N == sizeof(a)/sizeof(a[0])因此,
size_t对于数组大小来说,它也是一种方便的类型,因此在几个库函数中使用.[...]7.17通用定义
<stddef.h>是发明了提供与库结合广泛使用几种类型和宏的定义的报头:ptrdiff_t,size_t,wchar_t,和NULL.包括引用其中一个宏的任何头也将定义它,这是通常的库规则的一个例外,即每个宏或函数只属于一个头.
请注意,这特别提到它<stddef.h>是由C89委员会发明的.我没有找到那些说size_t也是由C89委员会发明的词,但如果不是,那就是C中最新发展的编纂.
在对bmargulies 回答的评论中,vonbrand说'它[ size_t]肯定是ANSI-C-ism'.我很容易相信它是原始ANSI(ISO)C的创新,尽管有点奇怪,理由并没有说明这一点.