繁体   English   中英

size_t是字大小吗?

[英]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不一定是运行代码的机器的“字大小”(在交叉编译的情况下)或者编译代码(在正常情况下代码将在相同类型的编译代码的机器)。 它是一个无符号整数类型,足以容纳实现可以分配的最大对象的大小(以字节为单位)。


sizeofsize_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运算符

正确使用诸如mallocfread之类的函数是正确的, 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_tsize_twchar_tNULL 包括引用其中一个宏的任何头也将定义它,这是通常的库规则的一个例外,每个宏或函数只属于一个头。

请注意,这特别提到<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM