インクリメンタル ガベージ コレクションをシミュレートする必要があるプロジェクトがあります。これは、マーク アンド スイープ法と組み合わせた世代アルゴリズムを使用します。これまでのところ、コードに示すように構造を設計しました。問題は、コードにメモリを割り当てることです。私は今ベクトルを使用しています。また、メモリの先頭と末尾を指すポインターを使用する必要があります。これを行う方法がわかりません。これを設計するのを手伝ってください。これまでの私のコードは次のとおりです。
#include <iostream>
#include <algorithm>
#include <string>
#include <iomanip>
#include <limits>
#include <stdio.h>
#include <sstream>
#include <vector>
using namespace std;
using std::stringstream;
string pMem, comment, sGen, val,input,id,size,inits,incs;
double pmemSize =0;
char t[10], m[256],init[10],inc[10];
struct rootset {
double totSize;
double *rStrtPtr;
double *rEndPtr;
vector<double> physicalM; /* This is the size of physical memory i need to assign*/
struct generations {
double totSize;
const char *genStrtPtr;
const char *genEndPtr;
int numOfGen;
string genName;
struct object {
double objSize;
const char *objStrtPtr;
const char *objEndPtr;
string id;
char markBit;
char objPtr;
};
struct freeList {
double freeSpace;
int flNumb;
};
};
};
int main()
{
int pmemSize;
cout<<" ENter the size "<<endl;
cin >> pmemSize;
vector<rootset> pRootSet;
pRootSet.push_back(rootset());
pRootSet[0].totSize = pmemSize;
pRootSet[0].physicalM.reserve(pmemSize);
for (int s=0; s<pmemSize; ++s)
pRootSet[0].physicalM.push_back(s);
vector<double>::iterator it;
for(it = pRootSet[0].physicalM.begin(); it!= pRootSet[0].physicalM.end(); ++it)
cout <<"Printing it: " <<(*it)<<endl;
}
私の問題は、ポインター *rStrtPtr と *rEndPtr を指す方法です。physicalM (物理メモリ) の最初の場所に..? 詳細: ユーザーは、シミュレーション用に予約する物理メモリの量を入力します。その単位はバイトです。簡単にするために、int を使用しました。割り当ては最大1 GBになる可能性があるため、後で2倍に変更します。physicalM というベクトルを作成しました。これは実際の物理メモリ ブロックです。これは後で世代に分割されます (サブ構造の世代によって示されます)。ユーザーがコマンドを指定する(abc = alloc(50B));
と、下位世代内に abc というオブジェクトを作成し、そのサイズの 50MB を割り当てる必要があります。(この部分は後で処理します)。どんな助けでも大歓迎です...
編集:コードでこの行を使用しようとしましたが、エラーが発生しました:
pRootSet[0].rStrtPtr = &(pRootSet[0].physicalM);
error: cannot convert ‘std::vector<double>*’ to ‘double*’ in assignment
編集:修正しました。rStrtPtr をベクトルとして初期化する必要がありました。