Domanda

Mentre ci sono un sacco di diverse implementazioni di sofisticati malloc / free per C / C ++, sto cercando una molto semplice e (soprattutto) piccolo che funziona su un buffer di dimensione fissa e supporti realloc. Thread-sicurezza, ecc non sono necessari ed i miei oggetti sono piccole e non variano molto in termini di dimensioni. C'è qualche implementazione che si potrebbe raccomandare?

Modifica :

userò che l'attuazione di un buffer di comunicazione al ricevitore ad oggetti di trasporto con dimensioni variabili (sconosciuto al ricevitore). Gli oggetti allocati non saranno vivo lungo, ma ci sono probabilmente diversi oggetti utilizzati contemporaneamente.

Per quanto tutti sembrano consigliare il malloc di serie, dovrei forse riformulare la mia domanda. Che cosa ho bisogno è l'implementazione "semplice" di malloc in cima a un buffer che posso iniziare a ottimizzare per le mie esigenze. Forse la domanda iniziale era chiara perché non sto cercando una malloc ottimizzato, solo per un semplice. Non voglio iniziare con una glibc-malloc ed estenderlo, ma con uno leggero.

È stato utile?

Soluzione

Kerninghan & Ritchie sembrano aver fornito un piccolo malloc / liberi nel loro libro C - questo è esattamente quello che stavo cercando per (reimplementazione trovato qui) . Io aggiungo solo una semplice realloc.

sarei ancora contento di suggerimenti per altre implementazioni che sono il più semplice e conciso come questo (per esempio, utilizzando le liste doppiamente collegate).

Altri suggerimenti

vi consiglio quello che è venuto con la libreria standard in bundle con il compilatore.

Si deve anche notare non v'è alcun modo legale per ridefinire malloc / libero

Il malloc / free / realloc che vengono con il compilatore sono quasi certamente meglio di alcune funzioni che si vuole inserire.

E 'possibile migliorare le cose per gli oggetti di dimensione fissa, ma che di solito non comporta cercando di sostituire il malloc ma completandolo con pool di memoria . In genere, si usa malloc per ottenere un grande pezzo di memoria che si può dividere in blocchi discreti di dimensioni appropriate, e gestire tali blocchi.

Sembra a me che siete alla ricerca di un pool di memoria. Il href="http://apr.apache.org/" rel="nofollow noreferrer"> biblioteca ha una abbastanza buona, ed è cross-platform troppo.

Esso non può essere del tutto leggero, ma la fonte è aperto ed è possibile modificarlo.

Io in genere non reinventare la ruota, con funzioni di allocazione a meno che il mio modello di memoria-utilizzo o non è supportato da malloc / etc. o memoria può essere suddivisa in una o più zone preassegnate, ciascuno contenente uno o due cumuli LIFO (liberando eventuali rilasci oggetto tutti gli oggetti nello stesso mucchio che sono stati assegnati dopo). In una versione comune di quest'ultimo scenario, l'unica volta nulla è liberato, tutto è liberato; in tal caso a, malloc () può essere utilmente riscritta come:

char *malloc_ptr;
void *malloc(int size)
{
  void *ret;
  ret = (void*)malloc_ptr;
  malloc_ptr += size;
  return ret;
}

Zero byte di overhead per oggetto allocato. Un esempio di uno scenario in cui un gestore di memoria personalizzato è stato utilizzato per uno scenario in cui malloc () era insufficiente è un'applicazione in cui record di test a lunghezza variabile prodotto dischi risultato lunghezza variabile (che potrebbe essere più lungo o più breve); l'applicazione necessaria per supportare il recupero dei risultati e di aggiungere altri test mid-batch. I test sono stati conservati a crescenti indirizzi da parte inferiore del buffer, mentre i risultati sono stati conservati a indirizzi decrescenti da cima. Come attività in background, prove successive a quella attuale sarebbero copiati nella all'inizio del buffer (poiché non vi era una sola puntatore che è stato utilizzato per leggere test per l'elaborazione, la logica copia aggiornerebbe che puntatore come richiesto). Aveva l'applicazione utilizzata malloc / gratuito, è possibile che la suddivisione delle allocazioni per i test ed i risultati avrebbero potuto frammentato di memoria, ma con il sistema utilizzato non vi era tale rischio.

C'è una relativamente semplice implementazione pool di memoria in Ccan :

http://ccodearchive.net/info/antithread/alloc.html

Questo appare come si adatta al vostro conto. Certo, alloc.c è 1230 linee, ma una buona parte di ciò è il codice di prova e la lista manipolazione. È un po 'più complessa di quanto il codice è implementato, ma l'allocazione di memoria decente è complicato.

Facendo eco consigli per misurare prima e specializzare solo se le prestazioni schifo -. Dovrebbe essere facile da astratto tuoi malloc / free / reallocs tale che la sostituzione è semplice

Data la piattaforma specializzata non posso commentare su efficacia dei tempi di esecuzione. Se fai indagare proprio pool di oggetti poi (vedi altre risposte) o piccole allocazione degli oggetti a la Loki o questo vale la pena dare un'occhiata. Il secondo link ha qualche interessante commento sulla questione pure.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top