当前位置: 首页 > 知识库问答 >
问题:

填充字节在内存分配器中被认为是已分配的还是未分配的?

澹台俊达
2023-03-14

我正在我的程序中编写一个自定义内存分配器,并试图更好地理解什么是被分配的内存与未分配的内存。我被告知,对于一个基本的、“朴素的”sbrk()内存分配器,对sbrk()调用必须提供与16字节对齐的大小(倍数)。这意味着,如果我需要分配5字节的内存,则应用操作(5+(16-1))&~(16-1)),在本例中,该操作最多舍入为16。如果请求的大小是17而不是5,那么它将舍入为32。

这意味着为了对齐,我们从操作系统返回的字节比用户请求的字节多。我的问题是,11个字节(在第一个例子中)还是15个字节(在第二个例子中)是否被认为是“分配的”?在内存分配器的正确实现中,用户是否实际使用了超过请求大小和16字节边界之间的请求字节?如果没有,这是如何执行的?

共有1个答案

陆曜文
2023-03-14

我的问题是,11个字节(在第一个例子中)还是15个字节(在第二个例子中)是否被认为是“分配的”?

不,它们不被视为已分配。更具体地说,这些字节不属于用户程序,而是属于内存分配器。

在内存分配器的正确实现中,用户是否实际使用了超过请求大小和16字节边界之间的请求字节?

 类似资料:
  • JVM规范(JSE 8版)提到: 第12页:2.5.2 JVM堆栈:“因为JVM堆栈除了用于推送和弹出帧之外,从来没有被直接操作过,所以帧可以被堆分配。” 第15页:2.6:帧:“帧是从创建帧的线程的JVM堆栈中分配的。”在第16页:“请注意,由线程创建的框架是该线程的本地框架,不能被任何其他线程引用。” 这听起来让我很困惑。既然一个帧是创建该帧的线程本地的,为什么要在堆中分配该帧,因为堆在所有J

  • 我正在我的google kubernetes引擎上设置一个pod say test-pod。当我部署pod并使用google控制台查看工作负载时,我能够看到默认分配给我的pod,但我无法看到我的pod消耗了多少内存。内存请求部分总是显示在那里。我知道我们可以在部署YAML中限制内存限制和初始分配。但是我想知道当没有通过YAML指定值时,pod会分配多少默认内存,它可以使用的最大限制是多少?

  • 我正在windows 8上运行弹性搜索4.1版。我试图通过java索引文档。运行JUNIT测试时,错误显示如下。 我不明白,为什么导致这个错误发生。当删除数据或索引时,它工作正常。可能的原因是什么。

  • 问题内容: 用户在我的网站上上传图像时出现此错误。 错误消息是“ PHP致命错误:/ home中内存不足(已分配80740352)(试图分配12352字节).....”如何使用php.ini解决此问题? 这是我当前的上传php.ini设置 任何想法我还需要添加什么来解决此错误? 问题答案: 最佳值取决于您对上传文件的处理方式。您是否使用file_get_contents或GD库将文件读入内存?在这

  • 我试图理解DirectByteBuffer如何在Linux上工作,并编写了以下在strace下运行的非常简单的程序: 实际上,我期望一些mmap或sys\u brk系统调用直接从操作系统分配内存,但实际上它只是设置请求页面的读写保护。我的意思是: 这似乎是分配直接缓冲区比分配堆缓冲区慢的原因,因为每次分配都需要系统调用。 如果我错了,请纠正我,但是堆缓冲区分配(如果发生在TLAB内部)相当于返回一