【问题标题】:Memory allocation function based on chunks基于块的内存分配函数
【发布时间】:2021-04-07 11:55:54
【问题描述】:

我必须创建一个内存分配程序,该程序应该将内存块分配给包含 8 个连续内存位置的内存。 N 是内存大小,M 是程序可以请求的最大位置数,X 是请求的内存位置数。内存被分成 M 个块,每个块由 N/M 个内存位置组成。 N/M 必须大于 M,否则程序将没有足够的内存分配给一个块。 POS的第一个元素存储1个内存位置的第一个可用块所在的位置(在内存中),第二个元素存储2个内存位置的第一个可用块所在的位置(在内存中),依此类推。如果数组 POS 中的第 i 个元素存储数字 -1,则意味着在第 i 个块中没有可用的 (i+1) 个内存位置块。如果 POS[X-1] 存储的值与 -1 不同,则表示有空间分配 X 块。在这种情况下,将返回存储在 POS[X-1] 中的值。否则,返回值 -1。

根据我对问题的理解,它希望我创建一个内存分配程序,将 8 个内存位置分成块。每个块需要大约与 M 一样大,这是程序可以请求的最大内存位置数。所以问题中的 M 是 3,所以每个块应该是大约 3 个内存位置,这意味着两个块 3 和一个块 2。现在第一个块仅分配给只需要 1 个内存位置的请求,第二个块用于需要的请求2 个连续的内存位置和第三个块用于需要 3 个内存位置的请求。 Example using 16 memory positions。这是我目前所拥有的。

#include <iostream> 
using namespace std; 
  
int search(int arr[], int n, int m, int x) 
{ 
    int POS[m];
    
    if(POS[x-1]!=-1){
        return POS[x-1];
    } return -1;
} 
  
int main(void) 
{ 
    int arr[] = { -1, -1, -1, -1, -1, -1, -1, -1 }; //example array, -1 represents available memory space
    int x = 2; //example number of memory positions requested 
    int n = sizeof(arr) /sizeof(arr[0]); //size of array
    int m = 3; //maximum number of positions a program can request
    
    int result = search(arr, n, m, x); 
    if(result == -1) {
        cout << "No slots available"; 
    } else { 
        cout << x << " slots available at index " << result;; 
    }
}

【问题讨论】:

  • 你需要弄清楚你的命名法——在你这样做之前,你的描述对人类来说是模棱两可的(这意味着没有办法将它翻译成计算机可以理解的代码——本质上是一个需要学究式明确指示才能正常工作的无知者)。例如,当您说“8 字节内存”时,您的意思是 地址 存储在 8 个字节中吗?如果您还假设一个字节由 8 位组成(标准不保证这一点),这通常称为 64 位内存。
  • @Peter 在这种情况下,它意味着 8 个连续的内存位置。我不确定,但哪些其他术语不明确?

标签: c++ search


【解决方案1】:

换个说法,听起来你的问题本质上是有一个 N 个整数数组,其中-1 表示一个“可用”元素,目标是找到 X 个连续可用元素的位置。我忽略了 M 和 POS 数组。

换句话说,找到 X 或更多 -1 值的运行。以下是使用 O(N) 搜索的大纲:

  1. count 初始化为零。

  2. 做一个循环,对于 i = 0, 1, ..., N - 1:

    • 如果arr[i] 可用,则增加计数。如果计数现在等于 X,则返回 (i - X) 作为 X 个连续可用元素的起始位置。
    • 否则,将计数重置为零。

编辑:根据您的评论和example image,听起来M 大小的块的意义在于每个内存块可能只包含一个分配。当分配小于 M 时,这种方法当然会浪费一些元素,但确实使分配搜索更容易。

大纲:

  • 对于每个块...

    • 检查块的第一个arr元素是否未被使用。如果是这样,那么整个块都可以通过“每个块分配一个”假设获得。
    • 要覆盖边缘情况,如果这是最后一个块,请检查其大小是否至少为 X。
    • 如果这两个条件都为真,则返回当前块。

【讨论】:

  • 根据我对这个问题的理解,它希望我创建一个内存分配程序,将 8 个内存位置分成块。每个块需要大约与 M 一样大,这是程序可以请求的最大内存位置数。所以问题中的 M 是 3,所以每个块应该是大约 3 个内存位置,这意味着两个 3 块和一个 2 块。现在第一个块只分配给 1 个内存位置块,第二个块分配给 2 个连续内存块,第三个块用于 3 个连续内存块的块。 Example using 16 memory positions
  • 感谢您的澄清。那么 IIUC 每个块可能只包含一个分配?请参阅上面我的答案的编辑。
  • 你知道这部分是什么意思吗?如果数组 POS 中的第 i 个元素存储数字 -1,则意味着在第 i 个块中没有可用的 (i+1) 个内存位置块。
  • 对不起,这里有很多细节。我没有遵循 POS 与问题的相关性。在您发布的代码中,POS 是 search() 函数本地的未初始化数组。 POS 应该是search() 的输入吗?还是search() 应该产生 POS 作为输出?我建议编辑您的帖子以澄清问题陈述是什么,并将其与您对解决方案的进展描述区分开来。
猜你喜欢
  • 2011-01-06
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多