Haruskah saya mengajar siswa saya mengalokasikan? [Tutup]

18

Seberapa banyak digunakan allocadi dunia nyata? Haruskah saya mengajar siswa saya untuk menggunakan allocaketika itu masuk akal? Atau haruskah saya mengajari mereka untuk tidak menggunakannya? Berasal dari latar belakang C ++ RAII, ide untuk tidak harus menelepon freesecara manual terdengar menjanjikan, terutama dalam fungsi dengan beberapa titik keluar.

fredoverflow
sumber
8
Mengapa tidak mengajari mereka C99 VLA?
@cnicutar alokasi () tergantung pada implementasi tetapi setidaknya banyak implementasi mengembalikan NULL pada kegagalan. C99 VLA tidak memiliki cara untuk menunjukkan kegagalan.
Rumit lihat bio
2
@ sbi: Bagi SO, ini adalah pertanyaan terbuka yang tidak benar-benar sesuai dengan format dari apa yang dipikirkan oleh para penutup sebagaimana seharusnya. Itu terlalu subjektif, tidak ada jawaban yang jelas, hanya pendapat. Yang baik-baik saja tetapi tidak untuk SO. Perhatikan juga bahwa untuk menghormati perwakilan OP, tidak ada yang memilih, kami hanya menutup pertanyaan ini sebagai topik yang tidak biasa.
Paul Sasik
1
@ PascalCuoq Anda tidak seharusnya mengalokasikan banyak dengan mengalokasikan / VLA pula. Jika tidak yakin apa "banyak" dalam konteks saat ini, gunakan malloc.

Jawaban:

31

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
Satu-satunya penggunaan yang saya lihat di mana itu tidak akan lebih baik dilakukan dengan cara lain adalah melakukan deteksi tumpukan smash pada beberapa versi Windows, di mana kegagalan untuk mengalokasikan menunjukkan ruang yang tersisa tidak cukup - atau mungkin hanya memiliki beberapa ASM degil untuk menangkap crash ; sudah lama sejak saya melihat kode itu. Itu berhasil, tetapi sedikit menakutkan.
Donal Fellows
13

Saya dapat melihat dua hal terjadi:

  1. Para siswa memahami dampak dari alloca, membaca tentang perbedaan antara tumpukan dan tumpukan, dan gunakan allocadengan cermat. (tidak sepertinya)

  2. Para siswa berpikir "wow, ini seperti malloctanpa khawatir tentang free," 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:

#include <malloc.h>

int OverflowMyStack(int start) {
    if (start == 0)
        return 0;

    char * p = (char *)_alloca(4096);
    *p = '0';
    return OverflowMyStack(start - 1);
}

int main () {
    return OverflowMyStack(512);
} 

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.

Selikuran
sumber
1
Saya pikir sebagian besar siswa masih termasuk dalam kategori kedua bahkan setelah menunjukkan kepada mereka contoh kode.
rightfold
@ IPT - Mungkin, tapi itu sebabnya Anda mengatakan kepada mereka untuk tidak menggunakannya bahkan setelah menunjukkan kepada mereka apa yang bisa terjadi.
BlackJack
4
Mengapa kode itu digunakan _allocabukan alloca? Dan mengapa itu memberikan hasil?
Keith Thompson
5

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 ...)

hugomg
sumber
2

Tidak.

Satu-satunya alasan programmer C bahkan harus menyadari keberadaan alokasi adalah untuk memahami dan memperbaiki kode warisan yang menggunakannya.

Setiap penggunaan allocaadalah baik

  1. Tidak berguna, yaitu secara sepele bisa digantikan oleh variabel ukuran tetap dari durasi penyimpanan otomatis, OR
  2. Stack overflow berbahaya menunggu untuk terjadi.

Selain 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).

R .. GitHub BERHENTI MEMBANTU ICE
sumber
2
Tentu saja, sama sekali tidak ada yang bisa menggunakannya secara bertanggung jawab. Tidak, tidak pernah.
DeadMG
Satu-satunya penggunaan "bertanggung jawab" allocadalah 100% setara dengan array otomatis ukuran tetap, dan kurang portabel.
R .. GitHub BERHENTI MEMBANTU ICE
Saya kira, kalau begitu, tidak ada yang bisa mau mengalokasikan sejumlah dinamis, katakanlah, beberapa kilobyte yang tidak akan pernah meluap. Atau hubungi beberapa fungsi OS API yang akan memberi tahu mereka berapa banyak yang tersedia. Atau hanya menambah ukuran tumpukan menjadi banyak.
DeadMG
Jika beberapa KB dan Anda yakin memiliki beberapa KB, Anda bisa menggunakan T foo[5000];atau apa saja.
R .. GitHub BERHENTI MEMBANTU ICE
Hanya jika T memiliki konstruktor standar sepele. Jika saya membutuhkan kinerja, bahkan memori nol sederhana mungkin biaya saya. Tetapi tipe lain dapat memiliki logika konstruksi-standar yang lebih kompleks. Jika saya ingin, misalnya, membuat array secara dinamis 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.
DeadMG
1

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.

MartyTPS
sumber
0

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 menggunakan alloca(), atau mengalokasikan array sementara besar atau menggunakan rekursi melewati kedalaman tergantung pada konteks tertentu.

pengguna117529
sumber