To pytanie zyskało mroźny odbiór w SO, więc postanowiłem je tam usunąć i spróbować tutaj. Jeśli uważasz, że tutaj też nie pasuje, zostaw przynajmniej komentarz dotyczący sugestii, jak znaleźć przykład, którego szukam ...
Czy możesz podać przykład , w którym użycie C99 VLA oferuje rzeczywistą przewagę nad czymś takim, jak obecne standardowe mechanizmy C ++ RAII wykorzystujące stertę?
Przykład, który szukam powinien:
- Osiągnij łatwą do zmierzenia (może 10%) przewagę wydajności nad używaniem sterty.
- Nie ma dobrego obejścia, które w ogóle nie wymagałoby całej tablicy.
- W rzeczywistości skorzystaj z dynamicznego rozmiaru zamiast ustalonego maksymalnego rozmiaru.
- Jest mało prawdopodobne, aby spowodować przepełnienie stosu w scenariuszu normalnego użytkowania.
- Bądź wystarczająco silny, aby kusić programistę potrzebującego wydajności do włączenia pliku źródłowego C99 do projektu C ++.
Dodając pewne wyjaśnienie kontekstu: mam na myśli VLA w rozumieniu C99 i nieujęte w standardowym C ++: int array[n]
gdzie n
jest zmienną. I jestem za przykładem przypadku użycia, w którym przebija alternatywy oferowane przez inne standardy (C90, C ++ 11):
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
Jakieś pomysły:
- Funkcje przyjmujące varargs, które w naturalny sposób ograniczają liczbę przedmiotów do czegoś rozsądnego, ale nie mają żadnego użytecznego górnego limitu na poziomie API.
- Funkcje rekurencyjne, w których zmarnowany stos jest niepożądany
- Wiele małych przydziałów i wydań, w których narzut byłby zły.
- Obsługa tablic wielowymiarowych (takich jak matryce o dowolnym rozmiarze), w których wydajność ma kluczowe znaczenie i oczekuje się, że drobne funkcje będą często wprowadzane.
- Z komentarza: algorytm współbieżny, w którym przydział sterty ma narzut synchronizacji .
Wikipedia ma przykład, który nie spełnia moich kryteriów , ponieważ praktyczna różnica w stosowaniu sterty wydaje się nieistotna, przynajmniej bez kontekstu. Nie jest także idealny, ponieważ bez większego kontekstu wydaje się, że liczba przedmiotów może równie dobrze spowodować przepełnienie stosu.
Uwaga: konkretnie szukam przykładowego kodu lub sugestii algorytmu, który by z tego skorzystał, abym sam zaimplementował ten przykład.
alloca
, które moim zdaniem są w zasadzie takie same). Ale ta wielowątkowa rzecz jest dobra, edytując pytanie, aby ją uwzględnić!
malloc
zachowanie Linuksa jest zgodne ze standardem C.
alloca()
może naprawdę przyćmiewałbymalloc()
w środowisku wielowątkowym z powodu rywalizacji o blokadę w tym drugim . Ale to jest prawdziwy odcinek, ponieważ małe tablice powinny po prostu mieć ustalony rozmiar, a duże tablice i tak prawdopodobnie będą potrzebowały sterty.