[英]Is size_t the word size?
size_t
是编译代码的机器的字大小吗?
使用g ++解析,我的编译器将size_t
视为long unsigned int
。 编译器在内部选择size_t
的大小,或者在调用编译器之前, stddef.h
中的某些预处理器宏内的size_t
实际上是否为字大小?
还是我偏离轨道?
在C ++标准中,[support.types](18.2)/ 6:“类型size_t
是一个实现定义的无符号整数类型,它足够大,可以包含任何对象的字节大小。”
无论这意味着什么,这可能与“字大小”相同或不同。
没有; size_t
不一定是运行代码的机器的“字大小”(在交叉编译的情况下)或者编译代码(在正常情况下代码将在相同类型的编译代码的机器)。 它是一个无符号整数类型,足以容纳实现可以分配的最大对象的大小(以字节为单位)。
sizeof
和size_t
一些历史 我不知道size_t
何时被准确引入,但它是在1979年到1989年之间.K&R的第一版1978年的C编程语言没有提到size_t
。 第7版Unix程序员手册根本没有提到size_t
,而且可以追溯到1979年.Kernighan和Pike从1984年开始的“UNIX编程环境”一书中没有提到索引中的size_t
(也没有提到malloc()
或free()
,有点令我惊讶),但这只是指示性的,而不是决定性的。 C89标准肯定有size_t
。
C99 Rationale记录了有关sizeof()
和size_t
一些信息:
6.5.3.4 sizeof运算符
正确使用诸如
malloc
和fread
之类的函数是正确的,sizeof(char)
恰好是一个。 实际上,这意味着C语言中的一个字节是最小的存储单位,即使该单位是36位宽; 并且所有对象都由这些最小单元的整数组成。 如果内存可位寻址,也适用。 与K&R一样,C89将sizeof
运算符的结果定义为无符号整数类型的常量。 常见的实现和常见用法通常假设结果类型是int
。 依赖于此行为的旧代码从未被移植到将结果定义为int
以外的类型的实现。 C89委员会认为改变语言以保护错误代码并不合适。
sizeof
的类型,无论它是什么,都以size_t
形式发布(在库头<stddef.h>
),因为程序员能够引用这种类型是有用的。 此要求隐式地将size_t
限制为现有无符号整数类型的同义词。 另请注意,尽管size_t
是无符号类型,但sizeof
不涉及任何算术运算或转换,如果大小太大而无法表示为size_t
,则会导致模数行为,因此会抛弃任何概念,即最大的可声明对象可能也是如此即使在C89中使用unsigned long
或在C99中使用uintmax_t
。 这也限制了可以在数组中声明的元素的最大数量,因为对于N
元素的任何数组a
,
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说'it [ size_t
]肯定是ANSI-C-ism'。 我很容易相信它是原始ANSI(ISO)C的创新,尽管有点奇怪,理由并没有说明这一点。
不必要。 C ISO规范(§17.1/ 2)将size_t
定义为
size_t,这是
sizeof
运算符的结果的无符号整数类型
换句话说, size_t
必须足够大以容纳可以从sizeof
生成的任何表达式的sizeof
。 这可能是机器字大小,但它可能会小得多(例如,如果编译器限制了数组或对象的最大大小)或者大得多(如果编译器允许您创建对象如此之大以至于单个机器) word无法存储该对象的大小)。
希望这可以帮助!
size_t或者只是sys / types.h中的一个typedef(传统上在Unix / Linux上)。 例如,假设文件的最大大小或malloc的最大分配,它被认为是“足够大”。 然而,随着时间的推移,标准委员会抓住了它,因此它被复制到许多不同的头文件中,每次都有自己的#ifdef保护来保护多个定义。 另一方面,具有非常大的潜在文件大小的64位系统的出现使其角色变得模糊。 这是一个palimpset。
语言标准现在把它称为生活在stddef.h中。 它与硬件字大小没有必要的关系,也没有编译魔术。 请参阅其他答案,了解这些标准对于它有多大的说法。
这些定义都是实现定义的。 如果我需要最佳猜测大小,我会使用sizeof(char *),或者sizeof(void *)。 这给出的最好的是软件使用的明显字大小......硬件真正具有的可能是不同的(例如,32位系统可能通过软件支持64位整数)。
此外,如果您是C语言的新手,请参阅stdint.h,了解整数大小的各种材料。
尽管定义并未直接说明size_t
类型,
甚至不需要最小大小
,但它间接地给出了一些好的提示。 size_t
必须能够包含任何对象的字节大小,换句话说,它必须能够包含最大可能对象的大小。
最大可能的对象是一个数组(或结构),其大小等于整个可用地址空间。 不可能以有意义的方式引用更大的对象,除了交换空间的可用性之外,没有理由为什么它需要更小 。
因此,通过定义的措辞, size_t
在32位体系结构上必须至少为32位,在64位系统上至少为64位。 实现当然可以选择更大的size_t
,但通常情况并非如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.