Diese Frage wurde bei SO ziemlich eiskalt aufgenommen, daher habe ich beschlossen, sie dort zu löschen und stattdessen hier zu versuchen. Wenn Sie der Meinung sind, dass es auch hier nicht passt, hinterlassen Sie bitte zumindest einen Kommentar zum Vorschlag, wie Sie ein Beispiel finden können, nach dem ich suche ...
Können Sie ein Beispiel geben , bei dem die Verwendung von C99-VLAs einen echten Vorteil gegenüber aktuellen C ++ RAII-Mechanismen mit Standardhaufen bietet?
Das Beispiel, nach dem ich suche, sollte:
- Erzielen Sie einen leicht messbaren (vielleicht 10%) Leistungsvorteil gegenüber der Verwendung von Heap.
- Keine gute Problemumgehung, die nicht das gesamte Array benötigen würde.
- Profitieren Sie tatsächlich von der Verwendung einer dynamischen Größe anstelle einer festen Maximalgröße.
- Es ist unwahrscheinlich, dass im normalen Verwendungsszenario ein Stapelüberlauf verursacht wird.
- Seien Sie stark genug, um einen Entwickler zu verführen, der die Leistung benötigt, um eine C99-Quelldatei in ein C ++ - Projekt aufzunehmen.
Hinzufügen einer Klarstellung zum Kontext: Ich meine VLA im Sinne von C99 und nicht in Standard-C ++ enthalten: int array[n]
Dabei n
handelt es sich um eine Variable. Und ich bin nach einem Anwendungsfall, bei dem die Alternativen anderer Standards (C90, C ++ 11) übertroffen werden:
int array[MAXSIZE]; // C stack array with compile time constant size
int *array = calloc(n, sizeof int); // C heap array with manual free
int *array = new int[n]; // C++ heap array with manual delete
std::unique_ptr<int[]> array(new int[n]); // C++ heap array with RAII
std::vector<int> array(n); // STL container with preallocated size
Einige Ideen:
- Funktionen, die varargs verwenden, wodurch die Anzahl der Elemente natürlich auf einen vernünftigen Wert begrenzt wird, jedoch keine nützliche Obergrenze auf API-Ebene vorliegt.
- Rekursive Funktionen, bei denen verschwendeter Stapel unerwünscht ist
- Viele kleine Zuweisungen und Releases, bei denen der Heap-Overhead schlecht wäre.
- Umgang mit mehrdimensionalen Arrays (wie Matrizen beliebiger Größe), bei denen die Leistung von entscheidender Bedeutung ist und von kleinen Funktionen erwartet wird, dass sie stark eingebunden werden.
- Aus dem Kommentar: Gleichzeitiger Algorithmus, bei dem die Heap-Zuweisung einen Synchronisierungsaufwand hat .
Wikipedia hat ein Beispiel, das meine Kriterien nicht erfüllt , da der praktische Unterschied zur Verwendung von Heap zumindest ohne Kontext irrelevant erscheint. Es ist auch nicht ideal, da ohne mehr Kontext die Anzahl der Elemente sehr wohl zu einem Stapelüberlauf führen kann.
Hinweis: Ich bin speziell auf der Suche nach einem Beispielcode oder einem Vorschlag für einen Algorithmus, der davon profitieren würde, damit ich das Beispiel selbst implementieren kann.
alloca
, von dem ich denke, dass er im Grunde dasselbe ist). Aber diese Multithread-Sache ist gut, die Frage zu bearbeiten, um sie aufzunehmen!
malloc
Verhalten von Linux dem C-Standard entspricht.
alloca()
würde ermalloc()
in einer Multithread-Umgebung aufgrund des Lock-Konflikts in letzterer wirklich überstrahlen . Dies ist jedoch eine echte Strecke, da kleine Arrays nur eine feste Größe verwenden sollten und große Arrays den Heap wahrscheinlich sowieso benötigen.