size_t 的正确定义是什么? [复制]

2024-04-18

首先,我所说的“正确的定义”是什么意思?

例如,K&R《C 程序设计语言》第二版。,在部分2.2 数据类型和大小,对整数做出非常清楚的陈述:

  • short, int and long对于整数类型。它们需要代表不同边界的值。
  • int是特定硬件的“自然”大小的数字,因此也可能是最快的。
  • 整数类型的大小short, int and long纯粹依赖于实现。
  • 但他们有限制。
  • short and int应至少保存 16 位。
  • long应至少保存 32 位。
  • short >= int >= long.

这是非常清楚和明确的。但事实并非如此size_t类型。在 K&R 5.4 地址算术中,他们说:

  • ...size_t是返回的无符号整数类型sizeof操作员。
  • The sizeof运算符产生存储其操作数类型的对象所需的字节数。

In C99标准草案 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf, in 6.5.3.4 sizeof 运算符, 他们说:

  • 结果的值是实现定义的,其类型(无符号整数类型)是size_t,定义于<stddef.h>(和别的 标题)。

In 7.17 通用定义:

  • size_t这是 sizeof 运算符结果的无符号整数类型;

In 7.18.3 其他整数类型的限制:

  • size_t 的限制SIZE_MAX 65535

还有一篇很有用的文章——为什么 size_t 很重要 http://www.embedded.com/electronics-blogs/programming-pointers/4026076/1/Why-size-t-matters。它说如下:

  • 好吧,让我们试着想象一下,如果没有的话会怎样?size_t.
  • 例如,我们以void *memcpy(void *s1, void const *s2, size_t n);标准函数来自<string.h>
  • 让我们使用int代替size_t for n范围。
  • 但内存大小不能为负,所以我们最好采取unsigned int.
  • 很好,看来我们现在很幸福,没有size_t.
  • But unsigned int大小有限 - 如果有一台机器可以复制大于unsigned int能把持住?
  • 好的,我们来使用unsigned long那么,现在我们幸福吗?
  • 但对于那些使用较小内存块运行的机器来说,unsigned long效率会很低,因为long不是“自然的” 对于他们来说,他们必须执行额外的操作才能与longs.
  • 那么我们为什么需要size_t- 表示特定硬件可以立即运行的内存大小。在某些机器上会是 等于int, 对其他人 - 至long,取决于哪种类型 他们是最有效率的。

我从中了解到的是size_t严格限制于sizeof操作员。因此size_t表示对象的最大大小(以字节为单位)。它还可能表示特定 CPU 型号可以一次移动的字节数。

但这里对我来说仍然有很多谜团:

  • C语言中的“对象”是什么?
  • 为什么它被限制为 65535,这是 16 位可以表示的最大数字?文章关于嵌入式网站说,那size_t也可以是32位的。
  • K&R 说,int平台具有“自然”大小,它可以等于int or to long。那么为什么不使用它来代替size_t如果它是“自然的”?

UPDATE

还有类似的问题:

C 中的 size_t 是什么? https://stackoverflow.com/questions/2550774

但它的答案没有提供明确的定义或权威来源的链接(如果不算维基百科)。

我想知道什么时候使用size_t,什么时候不使用size_t,为什么引入它,以及它真正代表什么。


何时使用size_t

Use size_t表示非负索引,并使用可追溯到的值sizeof表达。

何时不使用size_t

每当一个值可能为负数时,例如当你减去指针时。这对于指向同一数组的指针是允许的,但它可能会产生负数,具体取决于指针的相对位置。还有另一种类型ptrdiff_t针对这种情况定义的。

为什么引入它

标准的设计者可以选择引入单独的类型,或者要求现有类型能够容纳尺寸。第一个选择为编译器编写者提供了更大的灵活性,因此设计者选择了单独的类型。

它真正代表什么

它能够表示内存中对象的大小,无论是数组还是数组struct,一个数组structs,数组的数组structs,或其他任何东西。大小以字节表示。

该类型也方便用于非负索引,因为它可以以最大粒度表示对任何大小的结构的索引(即对最大可能数组的索引)chars,因为标准要求char具有尽可能小的尺寸1).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

size_t 的正确定义是什么? [复制] 的相关文章

  • Mono 无法保存用户设置

    我在 Mono Ubuntu 上保存用户设置时遇到问题 这是代码示例 private void Form1 Load object sender EventArgs e string savedText Properties Setting
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • std::bind 重载解析

    下面的代码工作正常 include
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它

随机推荐