malloc su diverse piattaforme

2

Sto testando una implementazione dell'albero rosso-nero ( repository ) e trovo che con Windows 10 e gcc, malloc inizia a restituire NULL dopo aver inserito ca. 50 milioni di nodi ma su Linux funziona almeno fino a 100 milioni di nodi.

Quale conclusione posso trarre da questo risultato? È un bug nel mio programma o è che malloc è "più efficiente" (come?) Su Linux?

int test() {
    int T = 1000000000; //test case 1,000,000,000 nodes
    int r2;
    struct node *root = NULL;
    srand(time(NULL));
    struct node *z;
    LEAF = malloc(sizeof(struct node));
    LEAF->color = BLACK;
    LEAF->left = NULL;
    LEAF->right = NULL;
    LEAF->key = 0;

    while (T-- > 0) {
        r2 = (2 + T) * (rand() % 100); // data
        z = malloc(sizeof(struct node));

        if (z != NULL) {

            z->key = r2;
            z->left = NULL;
            z->right = NULL;
            z->parent = NULL;
            z->color = RED;

            root = insert(root, z);

        } else printf("malloc failed at node number %d", T);
    }
    root = NULL;
    return 0;
}
    
posta Niklas Rosencrantz 17.11.2018 - 06:19
fonte

2 risposte

3

È possibile trarre la conclusione che non è possibile effettuare un numero illimitato di chiamate malloc () di successo se non si rilascia la memoria in mezzo.

Potresti aver eseguito codice a 32 bit in un caso e codice a 64 bit nell'altro caso. I compilatori potrebbero allocare diverse quantità di memoria per una piccola struttura. malloc () potrebbe consumare diverse quantità di memoria per piccole allocazioni. Molte possibili differenze.

Puoi anche trarre la conclusione che se hai davvero bisogno di allocare decine di milioni di nodi allora forse una chiamata malloc () per ogni nodo non è il modo migliore per andare. Puoi anche trarre la conclusione che se hai davvero bisogno di allocare decine di milioni di nodi allora forse una diversa struttura di dati è più utile.

    
risposta data 17.11.2018 - 17:44
fonte
1

Una possibilità è che un processo a 32 bit su Linux abbia accesso a più memoria (4 GB) rispetto a un processo standard Windows a 32 bit (2 GB).

Non hai mostrato la definizione della tua classe Node nella domanda , ma dal tuo utilizzo è composta da 3 puntatori e due campi dati (eventualmente un int e un carattere). Su una build a 32 bit, è un minimo di 17 byte. Con padding per l'allineamento e un overhead malloc di 8 byte, che arriva a 32 byte per allocazione. Con 50 milioni di allocazioni, funziona a 1,6 GB di memoria, vicino al limite di 2 GB che un processo a 32 bit normalmente ha su Windows. Questo può essere espanso usando il flag di /LARGEMEMORYAWARE linker, che può fornire circa 4 GB di memoria di processo su un sistema operativo Windows a 64 bit. Ciò consentirebbe quindi di allocare circa 100 milioni di nodi, corrispondenti alla versione di Linux.

    
risposta data 17.11.2018 - 21:07
fonte

Leggi altre domande sui tag