相关疑难解决方法(0)

是什么让glibc malloc可以比较来自不同"对象"的指针?

指针与关系运算符相比较(例如<,<=,>=或>)仅由C标准定义当相同的聚合对象(结构,阵列或联合)内的指针都指向.这在实践中意味着形状的比较

if (start_object <= my_pointer && my_pointer < end_object+1) {
Run Code Online (Sandbox Code Playgroud)

可以变成

if (1) {
Run Code Online (Sandbox Code Playgroud)

通过优化编译器.尽管如此,在K&R的第8.7节"示例 - 存储分配器"中,作者进行了与上述类似的比较.他们原谅这个说法

然而,仍然有一个假设是,sbrk可以有意义地比较返回的不同块的指针.标准不保证这一点,它只允许在数组中进行指针比较.因此,这个版本malloc只能在一般指针比较有意义的机器之间移植.

此外,它出现的执行malloc用在glibc做同样的事情!

更糟糕的是 - 我偶然发现这一点的原因是 - 对于学校作业我应该实现一个基本的malloc功能,并且作业的指示要求我们使用K&R代码,但我们必须更换sbrk拨打电话mmap!

虽然比较来自不同sbrk调用的指针可能是未定义的,但它也只是略微可疑,因为你有某种心理直觉,返回的指针应该来自同一个内存区域.mmap根据我的理解,不同调用返回的指针甚至不能保证彼此远程相似,并且在mmap调用之间合并/合并内存块应该是非常非法的(并且它似乎glibc避免了这种情况,只需合并返回的内存)通过sbrk或内部内mmap,而不是在它们之间)的页面,但分配需要这个.

问题:有人可以发光

  1. 是否sbrk可以优化比较来自不同呼叫的指针,以及
  2. 如果是这样,glibc那会让他们逃脱它.

c malloc glibc language-lawyer

10
推荐指数
1
解决办法
356
查看次数

标签 统计

c ×1

glibc ×1

language-lawyer ×1

malloc ×1