Pertanyaan ini mendapat agak dingin di SO, jadi saya memutuskan untuk menghapusnya di sana dan coba di sini. Jika menurut Anda tidak cocok di sini, setidaknya tinggalkan komentar tentang saran bagaimana menemukan contoh yang saya cari ...
Bisakah Anda memberikan contoh , di mana menggunakan C99 VLA menawarkan keuntungan nyata dibandingkan dengan sesuatu seperti mekanisme CAIA RAPB-tumpukan standar saat ini?
Contoh yang saya cari harus:
- Dapatkan keunggulan kinerja yang mudah diukur (10% mungkin) dibandingkan menggunakan heap.
- Tidak memiliki solusi yang baik, yang tidak perlu seluruh array sama sekali.
- Sebenarnya mendapat manfaat dari menggunakan ukuran dinamis, bukan ukuran maksimum tetap.
- Tidak mungkin menyebabkan stack overflow dalam skenario penggunaan normal.
- Cukup kuat untuk menggoda pengembang yang membutuhkan kinerja untuk memasukkan file sumber C99 dalam proyek C ++.
Menambahkan beberapa klarifikasi pada konteks: Maksud saya VLA sebagaimana dimaksud oleh C99 dan tidak termasuk dalam standar C ++: di int array[n]
mana n
adalah variabel. Dan saya mencari contoh use case yang mengalahkan alternatif yang ditawarkan oleh standar lain (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
Beberapa ide:
- Fungsi mengambil varargs, yang secara alami membatasi jumlah barang untuk sesuatu yang masuk akal, namun tanpa batas atas tingkat API yang berguna.
- Fungsi rekursif, di mana tumpukan sia-sia tidak diinginkan
- Banyak alokasi dan rilis kecil, di mana tumpukan overhead akan buruk.
- Menangani array multi-dimensi (seperti matriks ukuran sewenang-wenang), di mana kinerjanya sangat penting, dan fungsi-fungsi kecil diharapkan banyak mendapat inline.
- Dari komentar: algoritma bersamaan, di mana alokasi tumpukan memiliki overhead sinkronisasi .
Wikipedia memiliki contoh yang tidak memenuhi kriteria saya , karena perbedaan praktis untuk menggunakan tumpukan tampaknya tidak relevan setidaknya tanpa konteks. Ini juga tidak ideal, karena tanpa lebih banyak konteks, tampaknya jumlah barang dapat menyebabkan stack overflow.
Catatan: Saya secara khusus mencari kode contoh, atau saran algoritma yang akan mendapat manfaat dari ini, bagi saya untuk mengimplementasikan contoh itu sendiri.
alloca
, yang saya pikir pada dasarnya adalah hal yang sama). Tetapi hal multithreaded itu baik, mengedit pertanyaan untuk memasukkannya!
malloc
perilaku Linux sesuai dengan standar C.
alloca()
benar-benar akan lebih cemerlangmalloc()
dalam lingkungan multithreaded karena pertikaian kunci dalam paku yang terakhir . Tetapi ini adalah peregangan nyata karena array kecil hanya harus menggunakan ukuran tetap, dan array besar mungkin akan membutuhkan heap.