繁体   English   中英

C ++对象在内存中是连续的吗?

[英]C++ objects contiguous in memory?

我不擅长C ++,我目前将一些代码移植到C.它分配了一大堆对象,如下所示:

o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*));

然后填写每个职位:

for(int u=0;u<SIZE;u++)
   nodes[u] = new o_list::Node();

根据我的理解,我们对有关内存的唯一保证是指向对象的指针实际上是连续的,即它可能发生在我们有:

 _____________________
|x||x||x||x||x||x||x|x| -> contiguous array of pointers;
 |   \ \         
 |    \ \______
 |     \       \
 O      O       O       -> not contiguous positions of objects;

为了纠正这个问题,我尝试了第一个数组(指针),然后malloc一个对象数组,然后将指针指向正确的位置,如下所示:

o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*));

o_list::Node* contObjs = (o_list::Node*)malloc(SIZE*sizeof(o_list::Node));

for(int u=0;u<SIZE;u++){
   contObjs[u] = o_list::Node();
   nodes[u] = &contObjs[u];
}

但这会导致分段错误。 我想知道我的假设是否正确以及为什么我在第二个选项中出现分段错误。

谢谢

你是在正确的路线,虽然完全摆脱第一个阵列会更好(如果可以的话)。 它可能涉及程序中其他地方的一些设计更改,所以让我们暂时离开。

至于你的分段错误,我能看到的唯一问题是如果SIZE不等于300000 ,你将超出界限。 为什么不在循环中使用SIZE

目前尚不清楚为什么需要一个指针数组开始。

不过,这里有几种方法可以实现您的要求:


o_list::Node  objArray[SIZE];
o_list::Node* ptrArray[SIZE];

for (int i=0; i<SIZE; i++)
    ptrArray[i] = objArray+i;

o_list::Node* objArray = malloc(SIZE*sizeof(o_list::Node));
o_list::Node* ptrArray[SIZE];

for (int i=0; i<SIZE; i++)
    ptrArray[i] = objArray+i;

o_list::Node   objArray[SIZE];
o_list::Node** ptrArray = malloc(SIZE*sizeof(o_list::Node*));

for (int i=0; i<SIZE; i++)
    ptrArray[i] = objArray+i;

o_list::Node*  objArray = malloc(SIZE*sizeof(o_list::Node));
o_list::Node** ptrArray = malloc(SIZE*sizeof(o_list::Node*));

for (int i=0; i<SIZE; i++)
    ptrArray[i] = objArray+i;

我不是C ++的专家,但是不存在会分配连续对象数组的new数组形式吗? 像这样的东西?

MyClass * arrayOfMyClass = new MyClass[5];

现在你可以说“但我把它转换为C,C没有新的”。 这是事实,但C也没有类和运算符重载和复制构造函数。 如果要使用malloc,则需要掌握nettle并将Node类转换为C结构。 原因是malloc()不是new的C等价物。

new分配的内存构造对象。 malloc只分配内存。 你甚至不能保证它给你的内存是零填充。 在C中,您需要提供初始化函数来执行构造函数的操作。 您的代码的C等价物将类似于:

void Node_init(struct Node* aNode)
{
    // Any initialisation you need to do of its members
}

...

struct Node* contObjs = malloc(SIZE * sizeof *contObjs); // or use calloc to get zero filled memory

for(int u=0;u<SIZE;u++) {
   Node_init(&contObjs[u]); // Pass the address of the u'th element
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM