C 是否为mmap ed区域a“;“单一对象”;我可以比较里面的指针吗?

C 是否为mmap ed区域a“;“单一对象”;我可以比较里面的指针吗?,c,pointers,language-lawyer,mmap,C,Pointers,Language Lawyer,Mmap,我正在使用mmap进行malloc实现,作为学校练习 我想使用元数据的地址来计算空闲列表中内存块的大小 但我不确定该解决方案是否会在C标准中得到很好的定义,我没有找到关于mmap分配区域是否被视为C标准中该部分意义上的“对象”的参考: §6.5.8.5(引自一个有点相关的问题): 比较两个指针时,结果取决于指向的对象在地址空间中的相对位置。如果指向对象的两个指针或不完整类型都指向同一对象,或者都指向同一数组对象的最后一个元素,则它们的比较相等。如果指向的对象是同一聚合对象的成员,则指向稍后声明的

我正在使用mmap进行malloc实现,作为学校练习

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

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

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

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


换句话说,我可以把MMAP区域看作是标准中的字节数组(或者<代码> char < /代码>)吗?

是的,你可以这样做,作为一个最初没有有效类型的对象-否则,

mmap
系统调用将完全无用,并且可以预期针对POSIX系统的C编译器不应使
mmap
无用…

C标准仅描述以某些方式形成的指针的语义。实现可以自由地将它们认为合适的任何语义分配给以其他方式形成的指针。根据标准的作者,C的精神包括基本原则“不阻止程序员做需要做的事情”,他们可能希望适合各种任务的高质量实现应该避免给试图完成这些任务的程序员带来不必要的障碍。这意味着,如果质量实现定义了创建指向与静态、自动或已分配持续时间的对象不关联的存储区域的指针的方法,那么它应该有效地处理这些指针,即使标准不要求它这样做

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


涉及以实现不理解的方式分配地址的操作只会在实现描述的范围内定义。在某些实现中,标准将把不相关指针的比较描述为UB这一事实应视为不相关,因为标准没有说明此类指针的行为。然而,在另一些方面,该标准将某些行为描述为UB将占主导地位。不幸的是,很难知道哪种情况适用于任何特定情况。

您可以查看emacs的垃圾收集器,了解它是如何在内部实现分配的。它使用红黑树,每个节点是8K的一段。在GC过程中比较每个段的指针。