-1

我有一个项目需要我模拟增量垃圾收集。这使用了与标记和扫描方法相结合的分代算法。到目前为止,我已经设计了一个如代码所示的结构。问题在于为代码分配内存。我现在正在使用向量。我还需要使用指针指向内存的开头和内存的结尾。我不知道该怎么做。请帮我设计这个。到目前为止,这是我的代码。

#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; 到物理M(物理内存)的第一个位置..?详细信息:用户输入要为模拟保留的物理内存量。它以字节为单位。为简单起见,我只使用了 int。我稍后会将其更改为双倍,因为分配可以达到 1 GB。我创建了一个名为physicalM 的向量。这是实际的物理内存块。这稍后将分为几代(由子结构生成表示)。当用户指定一个命令时,(abc = alloc(50B));我将不得不在较低的一代中创建一个名为 abc 的对象,并为其分配 50MB 的大小。(这部分我稍后会照顾)。任何帮助表示赞赏...

编辑:我尝试在代码中使用这一行,但出现错误:

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

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

编辑:修复它。必须将我的 rStrtPtr 初始化为向量。

4

1 回答 1

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.

我不确定您为什么要存储数据大小double。一个unsigned long可以存储 2^32 - 1 (4294967295),即 4GB。

于 2013-05-18T00:51:32.750 回答