2013-05-18 1 views
-1

У меня есть проект, который требует, чтобы я смоделировал сборщик мусора. Это использует алгоритм генерации в сочетании с методом маркировки и развертки. Пока я разработал структуру, как показано в коде. Проблема заключается в распределении памяти для кода. Теперь я использую векторы. Мне также нужно будет использовать указатель, чтобы указать на начало памяти и конец памяти. Я не знаю, как это сделать. Пожалуйста, помогите мне с этим. Вот мой код.инкрементное моделирование сбора мусора с использованием C++

#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; к первому местоположению физического М (физической памяти) ..? Подробности: Пользователь вводит количество физической памяти, которое должно быть зарезервировано для моделирования. Его в байтах. Для простоты только что используется int. Я буду менять его, чтобы удвоить его позже, так как распределение может увеличиться до 1 ГБ. Я создал вектор, называемый физическим. Это фактический блок физической памяти. Это позже будет разделено на поколения (обозначенные генерацией подструктуры). Когда пользователь указывает команду (abc = alloc(50B));, мне нужно будет создать объект с именем abc в нижнем поколении и назначить для него 50 МБ его размера. (Эта часть я позабочусь позже). Любая помощь приветствуется ...

Изменить: Я пытался использовать эту строку в коде, но я получаю сообщение об ошибке:

pRootSet[0].rStrtPtr = &(pRootSet[0].physicalM); 

error: cannot convert ‘std::vector<double>*’ to ‘double*’ in assignment 

Edit: Fixed его. должен был инициализировать мой rStrtPtr как вектор.

+0

Если мой дизайн нуждается в изменении, также дайте мне знать .. – Tuffy

+1

Вот связанный с этим вопрос о переполнении стека. Надеюсь, вы найдете это полезным: http://stackoverflow.com/questions/16474393/memory-allocation-for-incremental-garbage-collection-simulation-in-c –

+0

«Я не знаю, как это сделать. пожалуйста, помогите мне с конструированием этого »: в какой части вам нужна помощь в проектировании? –

ответ

2

Линия pRootSet[0].rStrtPtr = &(pRootSet[0].physicalM);

следует читать:

pRootSet[0].rStrtPtr = &(pRootSet[0].physicalM[0]); 

или

pRootSet[0].rStrtPtr = pRootSet[0].physicalM.data(); 

или

pRootSet[0].rStrtPtr = &*(pRootSet[0].physicalM.begin()); 
pRootSet[0].rEndPtr = &*(pRootSet[0].physicalM.end());  // this will point to the first byte AFTER the end of the buffer. 

Я не уверен, почему вы храните размеры данных в a double. unsigned long может хранить 2^32 - 1 (4294967295), который составляет 4 ГБ.

+0

Несомненно .. Спасибо ... – Tuffy