size_t是字大小吗?

gon*_*one 30 c c++ size-t

size_t编译代码的机器的字大小?

用g ++解析,我的编译器视图size_tlong unsigned int.在编译器被调用之前,编译器是否在内部选择某个预处理器宏的大小size_t,或者size_t实际上是stddef.h在字大小内设置的?

还是我偏离轨道?

Pet*_*ker 21

在C++标准中,[support.types](18.2)/ 6:"类型size_t是一个实现定义的无符号整数类型,它足够大,可以包含任何对象的字节大小."

无论这意味着什么,这可能与"字大小"相同或不同.

  • @ ZacharyO'Keefe我不认为这就是你的意思.根据定义,字节是可寻址存储器的最小部分. (6认同)
  • @ ZacharyO'Keefe - re:"有界" - 公平的问题.编译器不知道将运行程序的系统有多少内存,因此决定最大可能对象的内容不依赖于可用内存量.如果没有足够的内存来创建对象,程序将在运行时失败,有时以神秘的方式. (3认同)
  • @ ZacharyO'Keefe:标准中的引用没有说"最小",也没有关于机器碰巧有多少内存.它足够大,可以保存实现可以分配的_any object_的大小; 这是你可以假设的开始和结束. (2认同)
  • `size_t`不一定是指针的大小,不是.它通常是,但你可以有一个32位分段x86模型,其中一个指针是48位,但一个"对象"仍然只能是32位,所以`size_t`将是一个32位的值. (2认同)

Jon*_*ler 12

没有; size_t不一定是运行代码的机器的"字大小"(在交叉编译的情况下)或编译代码(在正常情况下代码将在同一类型的机器上运行)的意思编译代码).它是一个无符号整数类型,足以容纳实现可以分配的最大对象的大小(以字节为单位).


一些历史sizeofsize_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运算符

这是的功能,如正确使用方法基本mallocfreadsizeof(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.这也限制了可以在阵列中声明的元素的最大数量,因为对于任何数组aN 元素,

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的创新,尽管有点奇怪,理由并没有说明这一点.

  • 问题是`size_t`的大小是否与编译代码的机器的字大小有关.如果您在64位计算机上对8位或16位微处理器进行交叉编译,则程序的"size_t"大小可能与机器上的单词大小没有任何相似之处.编译 - 因此我提到了交叉编译. (2认同)