mmap-ed区域是“单个对象”,我可以比较它内部的指针吗?

问题描述 投票:3回答:2

我正在使用mmap开发malloc实现作为学校练习。

我想通过使用元数据的地址在我的空闲列表中计算我的内存块的大小。

但我不确定这个解决方案是否会在C标准中明确定义,我没有找到关于mmap分配区域是否被认为是C标准部分意义上的“对象”的参考:

§6.5.8.5(引自that answer的一个有点相关的问题):

比较两个指针时,结果取决于指向的对象的地址空间中的相对位置。如果指向对象或不完整类型的两个指针都指向同一个对象,或者两个指针都指向同一个数组对象的最后一个元素,则它们相等。如果指向的对象是同一聚合对象的成员,则指向稍后声明的结构成员的指针比指向结构中先前声明的成员的指针大,指向具有较大下标值的数组元素的指针比指向同一数组的元素的指针大。具有较低的下标值。指向同一个union对象的成员的所有指针都比较相等。如果表达式P指向数组对象的元素并且表达式Q指向同一数组对象的最后一个元素,则指针表达式Q+1将比P更大。在所有其他情况下,行为未定义。

换句话说,我可以将mmap区域视为标准中的字节数组(或char)吗?

c pointers language-lawyer mmap
2个回答
1
投票

是的,你可以合理地这样做,作为最初没有有效类型的对象 - 否则mmap系统调用将是完全无用的,人们可以预期,目标POSIX系统的C编译器不应该使mmap无用...


1
投票

C标准仅描述了以某种方式形成的指针的语义。实现可以自由地将他们认为合适的语义分配给以其他方式形成的指针。根据标准的作者,C的精神包括基本原则“不要阻止程序员做必须做的事情”,并且他们可能认为旨在适合各种任务的质量实施应该避免强加不必要的程序员试图完成这些任务的障碍。这表明如果质量实现定义了创建指向与静态,自动或分配持续时间对象无关的存储区域的指针的方法,它应该有用地处理这些指针,即使标准不要求它这样做。

遗憾的是,编译器编写者并不总是清楚他们的编译器在以各种方式配置时适合的目的范围。在许多情况下,编译器将比标准所要求的更详细地描述一类操作的行为,但是标准将把重叠的操作类别表征为调用UB。一些编译器编写者认为UB仅仅意味着标准没有要求,但超出标准要求的行为描述应该不受影响。其他人认为一个动作调用UB作为覆盖所有其他行为描述的事实。

涉及以实现不理解的方式分配的地址的动作仅将被定义到实现所描述的范围。在一些实施方式中,标准将表征例如因为标准没有说明这些指针将如何表现,所以将涉及无关指针的比较视为UB应该被视为无关紧要。然而,在其他情况下,标准将某些行为描述为UB占主导地位的事实。不幸的是,很难知道哪种情况适用于任何特定情况。

© www.soinside.com 2019 - 2024. All rights reserved.