c - 指针大小可以是 4.75 字节吗
问题描述
考虑一个总可用内存为 2^(38) 字节的系统。用户在这个系统上编写一个使用整个寻址空间的 C 程序。这个 C 程序中定义的指针的大小(以字节为单位)是多少。
解决方案
在 C 中,一个字节是一个基本单位。字节中的位数由每个单独的 C 实现定义。(八位现在很常见,但不是强制性的。这是最低要求。)
根据 C 2018 6.2.6.1 2,除了位字段,每个对象都由一个或多个字节组成。因此,指针在其 C 实现中必须是整数字节数,尽管指针中的某些位可能未使用。
指针使用的字节数最终由 C 实现决定,而不是由运行其程序的计算机或系统决定。总的来说,C 旨在被配置为“自然地”适应系统,因此指针和其他类型往往与机器的设计目标相匹配。但是,C 实现有时服务于特殊目的,例如支持旧源代码或仅提供一部分内存以节省资源。例如,在具有 64 位地址空间的机器上,我们可以选择使用 32 位 C 实现,因为 64 位指针占用的空间量是执行某些程序的重要成本。
因此,在具有 2个 38字节内存的系统上,需要 38 位来寻址每个字节。这导致了几种可能性,包括:
- 该系统有 8 位字节,C 实现使用 5 字节(40 位)指针,其中 38 位表示一个地址,另外两个可能被浪费或可用于某些错误检测或其他功能。
- 系统有八位字节,对齐有一些好处,所以C实现使用八字节指针。
- 假设系统有 19 位字节,C 实现使用其中两个作为指针。
- 系统有八位字节,C 实现使用四字节指针。每个 C 程序的地址空间中只有 2 32字节可用,尽管不同的 C 程序可能使用内存中 2 38字节的不同部分。
推荐阅读
- php - 使用 Selected 不会在下拉列表中显示任何内容
- laravel - Laravel putFile 方法错误文件不存在但 putFileAs 工作正常
- javascript - 如何在 Xamarin 表单中隐藏 WebView 显示的网页元素
- git - 致命:无法读取对象 X 输入/输出错误致命:索引包失败 - 使用 Dropbox 拉取 Git
- powershell - 无法将系统对象转换为字符串 Powershell
- postgresql - 将整个数据表(不是整个数据库)从本地机器复制到 heroku postgres
- python-3.x - 如果由另一个用户启动,cvxpy 会出错
- typescript - Nest.js/Mongoose:为什么我的预保存钩子无法触发?
- javascript - jquery-3.0.0.js 中的错误:“无法获取未定义或空引用的属性‘导出’”
- javascript - 离开页面时执行的 javascript - 更新旧代码