簡體   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