5 Stimmen

statischer Speicher vs. Heap-Speicher?

Ich arbeite in einer Umgebung mit eingeschränktem Speicher und muss Zeichenketten dynamisch erstellen, aber immer noch haben Sie nicht Heap-Speicher zu nehmen. Also macht dies Sinn:

static char staticStringBuffer[10240];
static size_t staticStringWatermark = 0;

void createString( const char * something, const char * somethingElse ) {
    char buf[1024];
    strcat(buf, "test");
    strcat(buf, something);
    strcat(buf, somethingElse);

    strcat(&staticStringBuffer[staticStringWatermark], buf);
    staticStringWatermark += strlen(buf+1);
}

Dies wahrscheinlich dosent kompilieren, aber ist, was ich versuche, vernünftig - statischen Speicher für Heap-Speicher zu opfern?

Dankeschön ^_^

4voto

unwind Punkte 377331

Das hängt natürlich davon ab, was Ihre spezielle Umgebung macht, wenn sie Ihr Programm lädt; wo werden die statischen Daten des Programms abgelegt? Auf vielen Betriebssystemen wird das Programm in den Heap-Speicher geladen und von dort aus ausgeführt, so dass Ihre statischen Daten immer noch auf dem Heap landen.

1voto

wallyk Punkte 55322

Das wird funktionieren. Etwas Vorsicht ist geboten, um nicht über das Ende des statischen Puffers hinaus zu schreiben, was in Ihrem Beispiel passieren würde, wenn strlen(something) + strlen(somethingElse) >= 10240.

1voto

Tim Post Punkte 32750

Ich stimme mit unwind überein.

Wenn ich gezwungen bin, statische Zuweisung zu verwenden, weise ich diese Blöcke in der Regel innerhalb des Bereichs zu, in dem sie verwendet werden, d. h. innerhalb der Funktion selbst.

d.h.

static char *createstring(char *foo, char *bar)
{
    static char ret[size];

    /* do some work, make sure you pay attention to the printf sub system when it
       tells you how many bytes weren't printed ... */

    return ret;
}

natürlich, indem man sicherstellt, dass die Eingabe in createstring() durch eine Art gegenseitigen Ausschluss geschützt ist und dass der Aufrufer das Ergebnis nicht verändern muss.

Abhängig von Ihrem Compiler, YMMV. Müssen Sie diese wirklich global machen?

0voto

Andy Shellam Punkte 14907

Wenn Speicher wirklich so restriktiv ist, könnten Sie nicht anhängen/strcat direkt auf die staticStringBuffer anstatt Ihre temp buf?

Ich nehme an, Sie wissen, dass dieser Code nicht thread-sicher ist? Sie brauchen ihn wahrscheinlich nicht, aber ich wollte nur sichergehen.

Verwenden Sie außerdem strncat anstelle von strcat - es verhindert Pufferüberläufe.

0voto

Wenn Sie Zeichenketten dynamisch erstellen müssen, benötigen Sie einen Heap, wenn auch nicht unbedingt den Standard-Heap, der mit Ihrer C-Laufzeitbibliothek geliefert wird. Wenn Sie sich in einer sehr eingeschränkten Umgebung befinden, sollten Sie Strings nicht dynamisch erstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X