記憶體管理(3602017秋招真題)
阿新 • • 發佈:2019-02-08
題目描述
物聯網技術的蓬勃發展,各種感測器紛紛出現。小B所在的專案組正在開發一個物聯網專案,她們在研究設計一種新的感測器。這種感測器有自己的基本處理單元,具有一定的自主性,能夠進行簡單的資料收集、處理、儲存和傳輸。為降低系統功耗並保證系統可靠性和可控性,他們要對記憶體進行基本的管理。研究小組計劃開發一個實驗性記憶體管理器,實現對記憶體的分配、釋放和整理。對應的介面為new、del和def,使用語法為:
new size:分配size位元組大小的記憶體塊,返回該記憶體塊的控制代碼handle,size為正整數;
del handle:釋放控制代碼handle指向的記憶體塊;
def:整理記憶體碎片,將所有已分配記憶體塊按地址從低到高的順序遷移,使空閒記憶體碎片在高地址端拼接在一起;
初始記憶體為 initSize 位元組大小的整片空閒記憶體,編號為 1 到 initSize 。
new size操作中,若存在不小於size的連續空閒記憶體,則按照小地址優先的原則從空閒記憶體區域中分配size大小的記憶體塊,標記該記憶體塊狀態為已分配,並返回指向該記憶體塊的控制代碼。若無法分配,則返回空(NULL)。
del handle操作釋放由handle標記的記憶體塊,標記被釋放的記憶體狀態為空閒。若handle為無效控制代碼,則返回ILLEGAL_OPERATION。
def 完成記憶體整理工作,無返回值。
根據設計,每次成功記憶體分配返回的控制代碼為一個正整數,從1開始,依次計數。失敗的儲存分配操作不影響計數。
專案小組將此項任務分配給小B,小B向你求助,你能幫她嗎?
輸入
輸入中有多組測試資料。每組測試資料的第一行為兩個正整數T和MaxMem(1<=T<=10000, 1<=MaxMem<=10000),其中T為操作次數,MaxMem為初始記憶體大小,隨後有T行操作指令。
物聯網技術的蓬勃發展,各種感測器紛紛出現。小B所在的專案組正在開發一個物聯網專案,她們在研究設計一種新的感測器。這種感測器有自己的基本處理單元,具有一定的自主性,能夠進行簡單的資料收集、處理、儲存和傳輸。為降低系統功耗並保證系統可靠性和可控性,他們要對記憶體進行基本的管理。研究小組計劃開發一個實驗性記憶體管理器,實現對記憶體的分配、釋放和整理。對應的介面為new、del和def,使用語法為:
new size:分配size位元組大小的記憶體塊,返回該記憶體塊的控制代碼handle,size為正整數;
del handle:釋放控制代碼handle指向的記憶體塊;
def:整理記憶體碎片,將所有已分配記憶體塊按地址從低到高的順序遷移,使空閒記憶體碎片在高地址端拼接在一起;
初始記憶體為 initSize 位元組大小的整片空閒記憶體,編號為 1 到 initSize 。
new size操作中,若存在不小於size的連續空閒記憶體,則按照小地址優先的原則從空閒記憶體區域中分配size大小的記憶體塊,標記該記憶體塊狀態為已分配,並返回指向該記憶體塊的控制代碼。若無法分配,則返回空(NULL)。
del handle操作釋放由handle標記的記憶體塊,標記被釋放的記憶體狀態為空閒。若handle為無效控制代碼,則返回ILLEGAL_OPERATION。
def 完成記憶體整理工作,無返回值。
根據設計,每次成功記憶體分配返回的控制代碼為一個正整數,從1開始,依次計數。失敗的儲存分配操作不影響計數。
專案小組將此項任務分配給小B,小B向你求助,你能幫她嗎?
輸入
輸入中有多組測試資料。每組測試資料的第一行為兩個正整數T和MaxMem(1<=T<=10000, 1<=MaxMem<=10000),其中T為操作次數,MaxMem為初始記憶體大小,隨後有T行操作指令。
對每組測試資料,按操作順序輸出操作結果。對每個new操作,在單獨行中輸出結果,成功時輸出其返回控制代碼值,失敗則輸出NULL。若del操作失敗,輸出ILLEGAL_OPERATION。def不產生輸出。
樣例輸入
6 10
new 5
new 3
del 1
new 6
def
new 6
樣例輸出
1
2
NULL
3
這種的資料不是很強,用模擬可以過,模組化一下,呼叫三個函式就好了,具體實現可以參考程式碼
AC程式碼:
#include <algorithm> #include <vector> #include <iostream> # define f(i,m,n) for(int i=m; i<=n; i++) # define mem(s) memset(s, 0, sizeof(s)); using namespace std; struct node { int h, x, y; }; int T, mmax, Handle; string ope; vector<node> v; int newFunc(int Size) { int len = v.size(); if (v.size() == 0) { if (Size <= mmax) { node temp;temp.x = 1;temp.y = 1 + Size - 1;temp.h = ++Handle; v.push_back(temp);return Handle; } else { return -1; } } else { if (1 + Size - 1 < v[0].x) { node temp;temp.x = 1;temp.y = 1 + Size - 1; temp.h = ++Handle; v.insert(v.begin(), temp); return Handle; } else { f(i, 0, len - 2) { if (v[i + 1].x - v[i].y - 1 >= Size) { node temp;temp.x = v[i].y + 1;temp.y = temp.x + Size - 1;temp.h = ++Handle; v.insert(v.begin() + i + 1, temp); return Handle; } } if (mmax - v[len - 1].y >= Size) { node temp;temp.x = v[len - 1].y + 1;temp.y = temp.x + Size - 1;temp.h = ++Handle; v.push_back(temp); return Handle; } return -1; } } } void defFunc() { if (v.size() == 0)return; int ll = v[0].y - v[0].x, l=v.size(); v[0].x = 1;v[0].y = v[0].x + ll; f(i, 1, l - 1) { int len = v[i].y - v[i].x; v[i].x = v[i - 1].y + 1; v[i].y = v[i].x + len; } } int delFunc(int H) { int l = v.size(); int f = 0; f(i, 0, l - 1) { if (v[i].h == H) { v.erase(v.begin() + i); return i; } } return -1; } int main() { while (cin >> T >> mmax) { v.clear(); Handle = 0; f(i, 1, T) { cin >> ope; int x; if (ope == "new") { cin >> x; int flage=newFunc(x); if (flage == -1) { printf("NULL\n"); } else printf("%d\n", flage); } else if (ope == "del") { cin >> x; int flage=delFunc(x); if (flage == -1)printf("ILLEGAL_OPERATION\n"); } else { defFunc(); } } } return 0; }