Anzeige:
Seite 2 von 2 ErsteErste 12
Ergebnis 16 bis 18 von 18

Thema: Zum 40.x malloc() und konsorten.

  1. #16
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Außerdem wird ein mit char[10] belegter Speicherbereich am Ende einer Funktion automatisch wieder freigegeben, im Gegensatz zu einem mit malloc alloziierten.

  2. #17
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    @Giuly
    Genau .

    richtig speicher allokieren :

    mach nur das dynamisch, was unbedingt dynamisch sein muss !
    temporaer 1024 byte anlegen und gleich wieder freigeben macht kein sinn, weil das wuerde locker aufn stack passen = 100mal performanter

    char* site = getSite(user, pass);
    free(site);

    sehr sehr schlechter Stil !

    besser:
    char buffer [1024];
    getSite(buffer,1024);

    oder richtig dynamsich :

    size_t size = 0;
    getSite(NULL,&size);
    if(size)
    {
    char * pBuffer = (char *)malloc(size * sizeof(char));
    getSite(pBuffer,&size);

    // .... was man damit tun wollte

    free(pBuffer);
    }

    ne wichtige Regel:
    Allokiere den Speicher immer im selben block, wo du ihn auch freigibst ! Sonst kommst irgendwann in teufels kueche ! Quasi ausnahme unter c++ : Konstruktor und destruktor einer klasse, das ist nicht der selbe block aber ebend auch sehr zusammenhaengend ^^

    also ne getSite funktion die dir nen allokierten pointer zurueckgibt, und drauf baut das ihn selber freigibst ist designtechnisch eher bedenklich, ausserdem unflexibel, weil die nie mit stackspeicher funzen wuerde (ok nur relevant wenn mikrocontroller proggst ^^)

    damit die funktionen die dir undefiniert viel speicher beschreiben auch funktioneren, haben solche methoden meist 2 "Modis".
    Wenn der Zeiger auf den Speicher auf den sie schreiben sollen 0 ist, dann geben sie nur die Groesse des benoetigten speichers zurueck ....
    ist der zeiger nicht 0, schreiben sie das ergebnis auf den speicher, aber nur soviel wie sie mit dem anderen parameter vorgegeben bekommen. (falls es mal mehr ist, das sie da nich ueber den speicher hinausschreiben ) meist geben die funtkionen dann nen fehlerwert, oder die anzahl der geschriebenen bytes inklusive fehlerwert (wenn negativ) zurueck ....

    ALso die signatur so ner funktion sollte dann so aussehen :
    int getSite(char * pBuffer, size_t * anz);

    damit kann man solche funktionen mit dynamsichen und mit statischen speicher betreiben ....

    So machens zumindest die meisten C libs ....

    und dynamischer speicher ist neumodisches teufelszeug ^^ also C als sprache gibts laenger. Frueher hatte man sowas nicht und es gab nur quasi stackspeicher .... oder nen zeiger aufn speicherbereich den man halt verwenden konnte. den musst man sich dann selber halt einteilen.
    Von daher kommt auch das hartnaeckige geruecht, das C um laengen
    performanter sei als c++, was technisch eigentlich bloedsinn ist. C Programmierer sind von haus eher gewoehnt, speicher aggresiv als block zu allokieren, und den sich selber zu portionieren .... was wesentlich performanter, aber vom speicher selber her auch aufwendiger iss als was c++ biblios und programmer gern tun, speicher haepchenweisse immer dann zu allokieren, wenn sie ihn wirklich mal brauchen ....

    merke malloc new und konsorten sind performance technisch schweineteuer !!!

    Ciao ....
    Geändert von RHBaum (24-11-2005 um 10:24 Uhr)

  3. #18
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201
    Zitat Zitat von RHBaum
    @Giuly
    Genau .

    richtig speicher allokieren :

    mach nur das dynamisch, was unbedingt dynamisch sein muss !
    temporaer 1024 byte anlegen und gleich wieder freigeben macht kein sinn, weil das wuerde locker aufn stack passen = 100mal performanter

    char* site = getSite(user, pass);
    free(site);

    sehr sehr schlechter Stil !

    besser:
    char buffer [1024];
    getSite(buffer,1024);

    oder richtig dynamsich :

    size_t size = 0;
    getSite(NULL,&size);
    if(size)
    {
    char * pBuffer = (char *)malloc(size * sizeof(char));
    getSite(pBuffer,&size);

    // .... was man damit tun wollte

    free(pBuffer);
    }

    ne wichtige Regel:
    Allokiere den Speicher immer im selben block, wo du ihn auch freigibst ! Sonst kommst irgendwann in teufels kueche ! Quasi ausnahme unter c++ : Konstruktor und destruktor einer klasse, das ist nicht der selbe block aber ebend auch sehr zusammenhaengend ^^

    also ne getSite funktion die dir nen allokierten pointer zurueckgibt, und drauf baut das ihn selber freigibst ist designtechnisch eher bedenklich, ausserdem unflexibel, weil die nie mit stackspeicher funzen wuerde (ok nur relevant wenn mikrocontroller proggst ^^)

    damit die funktionen die dir undefiniert viel speicher beschreiben auch funktioneren, haben solche methoden meist 2 "Modis".
    Wenn der Zeiger auf den Speicher auf den sie schreiben sollen 0 ist, dann geben sie nur die Groesse des benoetigten speichers zurueck ....
    ist der zeiger nicht 0, schreiben sie das ergebnis auf den speicher, aber nur soviel wie sie mit dem anderen parameter vorgegeben bekommen. (falls es mal mehr ist, das sie da nich ueber den speicher hinausschreiben ) meist geben die funtkionen dann nen fehlerwert, oder die anzahl der geschriebenen bytes inklusive fehlerwert (wenn negativ) zurueck ....

    ALso die signatur so ner funktion sollte dann so aussehen :
    int getSite(char * pBuffer, size_t * anz);

    damit kann man solche funktionen mit dynamsichen und mit statischen speicher betreiben ....

    So machens zumindest die meisten C libs ....

    und dynamischer speicher ist neumodisches teufelszeug ^^ also C als sprache gibts laenger. Frueher hatte man sowas nicht und es gab nur quasi stackspeicher .... oder nen zeiger aufn speicherbereich den man halt verwenden konnte. den musst man sich dann selber halt einteilen.
    Von daher kommt auch das hartnaeckige geruecht, das C um laengen
    performanter sei als c++, was technisch eigentlich bloedsinn ist. C Programmierer sind von haus eher gewoehnt, speicher aggresiv als block zu allokieren, und den sich selber zu portionieren .... was wesentlich performanter, aber vom speicher selber her auch aufwendiger iss als was c++ biblios und programmer gern tun, speicher haepchenweisse immer dann zu allokieren, wenn sie ihn wirklich mal brauchen ....

    merke malloc new und konsorten sind performance technisch schweineteuer !!!

    Ciao ....
    Ich hab das Programm jetzt in C++ umgeschrieben, ist bequemer.
    getSite() ist übrigens einfach nur das hier. Ich hab das jetzt erst in nen String gewandelt und dann free'd, das ist dann auch im gleichen Block

    MfG

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •