为什么所有指向结构的指针都必须具有相同的大小?

丹尼尔克莱因斯坦

C 标准规定:

指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。类似地,指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求。所有指向结构类型的指针都应具有相同的表示和对齐要求。所有指向联合类型的指针都应具有相同的表示和对齐要求。指向其他类型的指针不需要具有相同的表示或对齐要求。

sizeof(int*)不一定等于sizeof(char*)- 但sizeof(struct A*)一定等于sizeof(struct B*)

这个要求背后的原理是什么?据我了解,基本类型不同大小背后的基本原理 是支持近/远/巨大指针等用例 编辑:正如评论和接受的答案中指出的那样,这不是基本原理) - 但不是这个相同的原理适用struct于内存中不同位置的 s 吗?

知乎

答案很简单:structandunion类型可以声明为不透明类型,即:没有对structorunion细节的实际定义如果指向不同结构的指针具有不同的表示形式,则编译器将无法编译使用此类指针作为参数、返回值、从内存中读取或将它们存储到内存中的代码。

操作不透明指针类型的能力的自然结果是所有此类指针必须具有相同的表示。但是请注意,指向的指针struct和指向的指针union可能具有不同的表示形式,以及指向基本类型的指针,例如char, int, double...

关于指针表示的另一个区别是指向数据的指针和指向函数的指针之间的区别,它们可能具有不同的大小。这种差异在当前架构中更为常见,尽管在操作系统和设备驱动程序空间之外仍然很少见。函数指针的 64 位似乎是一种浪费,因为 4GB 应该足够用于代码空间,但现代架构利用这个额外的空间来存储指针签名,以加强代码抵御恶意攻击。另一个用途是利用忽略某些指针位的硬件(例如:x86_64 忽略前 16 位)来存储类型信息或使用未修改的 NaN 值作为指针。

此外,C 标准中的此注释没有正确解决遗留 16 位代码中的近/远/巨大指针属性,因为所有指针都可能是巨大的然而,它涵盖了混合模型代码中代码指针和数据指针之间的区别,并且在某些操作系统上似乎仍然存在。

最后,Posix 要求所有指针具有相同的大小和表示形式,因此混合模型代码应该很快成为历史上的好奇心。

有争议的是,对于不同数据类型表示不同的体系结构如今已经很少见了,现在是清理标准并删除此选项的时候了。主要反对意见是支持可寻址单元是大字和 8 位字节使用额外信息寻址的体系结构,这使得char *void *大于常规指针。然而,这样的架构使指针运算变得非常麻烦,而且也非常罕见(我个人从未见过)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么数组的每个元素都必须具有相同的大小?

来自分类Dev

NTTP 的结构类型:为什么所有成员都必须是公共的?

来自分类Dev

为什么“具有const成员的结构”类型的指针不能指向“具有非const成员的结构”?

来自分类Dev

为什么sizeof(std :: variant)的大小与具有相同成员的结构的大小相同?

来自分类Dev

谷歌的结构化数据错误:“提供http://www.example.com/所有值都必须具有相同的域名。”

来自分类Dev

为什么打印time.Time和指向time.Time的指针具有相同的结果?

来自分类Dev

为什么我不能拥有指向与成员变量具有相同指针类型的对象的指针?

来自分类Dev

为什么允许结构本身具有“指向其自身类型的指针”而不是成员“结构类型(的数组)”本身?

来自分类Dev

为什么在Android Studio 3.2.1中得到“所有com.android.support库都必须使用完全相同的版本规范”?

来自分类Dev

表达式必须具有指向结构或联合的指针类型?

来自分类Dev

在 Rust 中,一个类型的所有值都必须使用相同数量的内存是什么意思?

来自分类Dev

如何获得具有指向结构的指针的结构字段?

来自分类Dev

访问具有指向结构指针的结构中的整数

来自分类Dev

Mondrian MDX 查询错误:- 函数“{}”的所有参数必须具有相同的层次结构

来自分类Dev

RMarkdown:为什么每次编织时都必须重新安装所有软件包?

来自分类Dev

为什么此Jasmine测试失败,并且所有功能都必须在要测试的示波器上?

来自分类Dev

为什么所有Angular 2 ng-boostrap Modal代码都必须位于app.module.ts的顶部?

来自分类Dev

表达式必须具有指向类的指针错误

来自分类Dev

错误:表达式必须具有指向类的指针

来自分类Dev

GOOGLE LINE CHART ERROR:给定轴上的所有序列都必须具有相同的数据类型。空查询

来自分类Dev

设置字符串参数时,对模拟的所有调用都必须具有相应的设置

来自分类Dev

为什么 C 中没有函数返回指针指向的分配的内存大小?

来自分类Dev

为什么不将具有相同值的列表指向python中的相同内存位置?

来自分类Dev

如何列出指向golang结构所有字段的指针?

来自分类Dev

返回指向具有ctypes的结构的指针的函数

来自分类Dev

从结构类型的指针派生的所有指针是否都相同?

来自分类Dev

所有com.android.support库都必须使用完全相同的版本

来自分类Dev

人脸识别:每个人的所有图像都必须计数相同吗?

来自分类Dev

所有com.android.support库都必须使用完全相同的版本规范

Related 相关文章

  1. 1

    为什么数组的每个元素都必须具有相同的大小?

  2. 2

    NTTP 的结构类型:为什么所有成员都必须是公共的?

  3. 3

    为什么“具有const成员的结构”类型的指针不能指向“具有非const成员的结构”?

  4. 4

    为什么sizeof(std :: variant)的大小与具有相同成员的结构的大小相同?

  5. 5

    谷歌的结构化数据错误:“提供http://www.example.com/所有值都必须具有相同的域名。”

  6. 6

    为什么打印time.Time和指向time.Time的指针具有相同的结果?

  7. 7

    为什么我不能拥有指向与成员变量具有相同指针类型的对象的指针?

  8. 8

    为什么允许结构本身具有“指向其自身类型的指针”而不是成员“结构类型(的数组)”本身?

  9. 9

    为什么在Android Studio 3.2.1中得到“所有com.android.support库都必须使用完全相同的版本规范”?

  10. 10

    表达式必须具有指向结构或联合的指针类型?

  11. 11

    在 Rust 中,一个类型的所有值都必须使用相同数量的内存是什么意思?

  12. 12

    如何获得具有指向结构的指针的结构字段?

  13. 13

    访问具有指向结构指针的结构中的整数

  14. 14

    Mondrian MDX 查询错误:- 函数“{}”的所有参数必须具有相同的层次结构

  15. 15

    RMarkdown:为什么每次编织时都必须重新安装所有软件包?

  16. 16

    为什么此Jasmine测试失败,并且所有功能都必须在要测试的示波器上?

  17. 17

    为什么所有Angular 2 ng-boostrap Modal代码都必须位于app.module.ts的顶部?

  18. 18

    表达式必须具有指向类的指针错误

  19. 19

    错误:表达式必须具有指向类的指针

  20. 20

    GOOGLE LINE CHART ERROR:给定轴上的所有序列都必须具有相同的数据类型。空查询

  21. 21

    设置字符串参数时,对模拟的所有调用都必须具有相应的设置

  22. 22

    为什么 C 中没有函数返回指针指向的分配的内存大小?

  23. 23

    为什么不将具有相同值的列表指向python中的相同内存位置?

  24. 24

    如何列出指向golang结构所有字段的指针?

  25. 25

    返回指向具有ctypes的结构的指针的函数

  26. 26

    从结构类型的指针派生的所有指针是否都相同?

  27. 27

    所有com.android.support库都必须使用完全相同的版本

  28. 28

    人脸识别:每个人的所有图像都必须计数相同吗?

  29. 29

    所有com.android.support库都必须使用完全相同的版本规范

热门标签

归档