Seberapa banyak digunakan alloca
di dunia nyata? Haruskah saya mengajar siswa saya untuk menggunakan alloca
ketika itu masuk akal? Atau haruskah saya mengajari mereka untuk tidak menggunakannya? Berasal dari latar belakang C ++ RAII, ide untuk tidak harus menelepon free
secara manual terdengar menjanjikan, terutama dalam fungsi dengan beberapa titik keluar.
18
malloc
.Jawaban:
Jika Anda mengadakan kursus dalam pemrograman C umum, Anda tidak harus mengajari mereka hal yang tidak sesuai standar. Pemrogram pemula tidak perlu menulis kode non-standar dan / atau non-portabel karena mereka diajarkan seperti itu, telah menjadi masalah besar bagi industri perangkat lunak selama 20-30 tahun terakhir. Biaya untuk tidak mengajari mereka standar dan tidak lain hanyalah standar kemungkinan astronomi.
Jika Anda mengadakan kursus yang lebih maju dalam algoritma atau pemrograman aplikasi, mungkin ada baiknya menyebutkannya. Di sisi lain, saya telah memprogram semuanya, mulai dari aplikasi embedded realtime yang sulit hingga fluff aplikasi Windows selama 15 tahun tanpa pernah menggunakan fungsi itu.
sumber
Saya dapat melihat dua hal terjadi:
Para siswa memahami dampak dari
alloca
, membaca tentang perbedaan antara tumpukan dan tumpukan, dan gunakanalloca
dengan cermat. (tidak sepertinya)Para siswa berpikir "wow, ini seperti
malloc
tanpa khawatir tentangfree
," gunakan secara berlebihan, dapatkan stack overflow, dan tidak tahu apa yang terjadi.Saya pikir itu jauh lebih baik jika Anda jelaskan
alloca
, kemudian jalankan kode ini:Sumber: http://www.strchr.com/alloca
tunjukkan pada mereka bahaya, dan kemudian suruh mereka untuk tidak menggunakannya. Mereka masih akan belajar tentang tumpukan vs tumpukan, melihat bahaya dalam tindakan, dan dapat melanjutkan dengan hal-hal standar.
sumber
_alloca
bukanalloca
? Dan mengapa itu memberikan hasil?Jawaban untuk pertanyaan ini harus didasarkan pada apa tujuan Anda di tempat pertama.
Apakah Anda ingin mengajar seseorang yang sudah tahu cara memprogram cara menulis C dan bekerja dengan kode C yang ada di alam liar? Jika demikian, ceritakan tentang alokasi dan hal lain yang Anda inginkan.
Di sisi lain, jika Anda mengajar kursus pengantar yang hanya menggunakan C secara kebetulan (dan karena C adalah bahasa yang sangat kecil dan sebagainya) Anda harus fokus pada bagian-bagian penting (menulis program modular, subrutin, koleksi, .. .). Dari perspektif siswa, pengalokasian adalah bir yang berlebihan karena malloc cukup dalam banyak kasus dan dari perspektif kode yang baik Anda lebih baik menyebutkan secara eksplisit bagaimana manajemen memori manual mengganggu dan bagaimana bahasa lain menangani masalah ini. Lagi pula, ada lebih banyak hal-hal untuk manajemen memori kemudian mengalokasikan atau RAII sehingga Anda benar-benar tidak harus membatasi diri untuk ini dan seperti yang Anda sebutkan sebelumnya, jauh lebih mudah untuk memahami tujuan pengalokasian jika Anda membandingkannya dengan cara "lebih standar" lainnya untuk melakukan sesuatu dalam bahasa lain (atau C99 ...)
sumber
Tidak.
Satu-satunya alasan programmer C bahkan harus menyadari keberadaan alokasi adalah untuk memahami dan memperbaiki kode warisan yang menggunakannya.
Setiap penggunaan
alloca
adalah baikSelain beberapa eksperimen pemikiran yang belum pernah saya temukan contoh dunia nyata, tidak ada kasus penggunaan untuk
alloca
(atau VLA) yang tidak berguna atau rentan (salah satu dari 2 kasus di atas).sumber
alloc
adalah 100% setara dengan array otomatis ukuran tetap, dan kurang portabel.T foo[5000];
atau apa saja.std::mutex
, saya mungkin meminta panggilan kernel dan saklar konteks untuk lima ribu mutex. Tidak murah. Belum lagi biaya cache tambahan menempatkan variabel lokal setelah array.Pendapat saya jangan mendorong menggunakannya kecuali Anda mengajarkan prinsip-prinsip kompiler tingkat rendah yang digunakan untuk mengalokasikan ruang stack untuk variabel lokal. Ajarkan dalam konteks itu.
sumber
The dokumentasi GCC memiliki beberapa pro praktis dan kontra di
alloca()
. Dari perspektif praktis, sejumlah besar perangkat lunak bebas dapat menggunakannya, jadi ada baiknya untuk memahami cara kerjanya dan di mana ia digunakan dalam kode yang ada.Melewati
-Wl,-stack=
ukuran tumpukan-baru ke gcc meningkatkan ukuran tumpukan maksimum; Anda harus melakukan ini jika proyek Anda menggunakanalloca()
, atau mengalokasikan array sementara besar atau menggunakan rekursi melewati kedalaman tergantung pada konteks tertentu.sumber