Saya ingin tahu apa perbedaan antara alokasi memori statis dan dinamis alokasi memori?
Bisakah anda menjelaskan hal ini dengan contoh?
Ini adalah standar pertanyaan wawancara:
Adalah memori yang dialokasikan pada saat runtime dengan menggunakan calloc()
, malloc()
dan teman-teman. Hal ini kadang-kadang juga disebut sebagai 'heap' memori, meskipun ini tidak ada hubungannya dengan tumpukan data-struktur ref.
int * a = malloc(sizeof(int));
Tumpukan memori ini terus-menerus sampai gratis()
disebut. Dengan kata lain, anda mengontrol seumur hidup dari variabel.
Ini adalah apa yang dikenal sebagai 'stack' memori, dan dialokasikan ketika anda memasukkan lingkup baru (biasanya ketika sebuah fungsi baru yang mendorong pada panggilan stack). Setelah anda keluar dari ruang lingkup, nilai otomatis dari alamat memori yang tidak terdefinisi, dan itu adalah sebuah kesalahan untuk mengaksesnya.
int a = 43;
Perhatikan bahwa ruang lingkup tidak selalu berarti fungsi. Lingkup dapat bersarang di dalam sebuah fungsi, dan variabel yang akan di-lingkup hanya dalam blok yang dinyatakan. Perhatikan juga bahwa di mana memori ini dialokasikan tidak ditentukan. (Pada sane sistem itu akan di stack, atau register untuk optimasi)
Dialokasikan pada waktu kompilasi*, dan seumur hidup dari variabel di memori statis adalah seumur hidup dari program.
Dalam C, statis memori yang dapat dialokasikan dengan menggunakan statis
kata kunci. Ruang lingkup penyusunan unit saja.
Hal-hal yang lebih menarik ketika extern
kata kunci dianggap. Ketika sebuah extern
variabel defined compiler mengalokasikan memori untuk itu. Ketika sebuah extern
variabel declared, compiler membutuhkan bahwa variabel menjadi defined di tempat lain. Kegagalan untuk menyatakan/menetapkan extern
variabel akan menyebabkan menghubungkan masalah, sementara kegagalan untuk menyatakan/menetapkan statis
variabel akan menyebabkan kompilasi masalah.
di file ruang lingkup, static kata kunci opsional (di luar fungsi):
int a = 32;
Tapi tidak dalam ruang lingkup fungsi (dalam fungsi):
static int a = 32;
Secara teknis, s
dan statis
ini adalah dua kelas dari variabel C.
extern int a; /* Declaration */
int a; /* Definition */
It's agak membingungkan untuk mengatakan bahwa statis memori yang dialokasikan pada waktu kompilasi, terutama jika kita mulai mengingat bahwa penyusunan mesin dan mesin host mungkin tidak sama atau bahkan tidak mungkin pada arsitektur yang sama.
Mungkin akan lebih baik untuk berpikir that alokasi memori statis ditangani oleh compiler daripada allocated di mengkompilasi time.
Misalnya compiler dapat membuat besar data
bagian dalam dikompilasi biner dan ketika program dimuat dalam memori, alamat dalam data
segmen dari program ini akan digunakan sebagai lokasi memori yang dialokasikan. Hal ini ditandai kelemahan dari pembuatan disusun biner yang sangat besar jika menggunakan banyak memori statis. It's mungkin untuk menulis multi-gigabyte biner yang dihasilkan dari kurang dari setengah lusin baris kode. Pilihan lain adalah untuk compiler untuk menyuntikkan inisialisasi kode yang akan mengalokasikan memori pada beberapa cara lain sebelum program dieksekusi. Kode ini akan bervariasi sesuai dengan target platform dan OS. Dalam prakteknya, modern compiler menggunakan heuristik untuk memutuskan yang mana dari pilihan ini digunakan. Anda dapat mencoba ini pada diri sendiri dengan menulis C kecil program yang mengalokasikan dana besar array statis baik 10k, 1 m, 10 m, 100 m, 1G atau 10G item. Bagi banyak kompiler, biner ukuran akan terus berkembang secara linear dengan ukuran dari array, dan melewati suatu titik tertentu, itu akan menyusut lagi sebagai compiler menggunakan strategi alokasi.
Memori terakhir kelas 'daftar' variabel. Seperti yang diharapkan, daftar variabel yang harus dialokasikan pada CPU's mendaftar, tapi keputusan adalah benar-benar meninggalkan untuk compiler. Anda mungkin tidak mengubah variabel register menjadi referensi dengan menggunakan alamat dari.
register int meaning = 42;
printf("%p\n",&meaning); /* this is wrong and will fail at compile time. */
Paling modern compiler yang lebih pintar dari anda memilih variabel mana yang harus dimasukkan ke dalam register :)
Ada tiga jenis alokasi — statis, otomatis, dan dinamis.
Alokasi statis berarti, bahwa memori untuk variabel dialokasikan ketika program dijalankan. Ukuran adalah tetap ketika program yang dibuat. Ini berlaku untuk variabel global, file lingkup variabel, dan variabel-variabel yang memenuhi syarat dengan statis
yang didefinisikan di dalam fungsi.
Otomatis alokasi memori terjadi untuk (non-statis) variabel yang didefinisikan di dalam fungsi, dan biasanya disimpan pada stack (meskipun C standar doesn't mandat bahwa stack digunakan). Anda tidak harus memesan tambahan memori menggunakan mereka, tapi di sisi lain, juga memiliki kontrol terbatas atas seumur hidup dari memori ini. E. g: otomatis variabel dalam sebuah fungsi yang hanya ada sampai fungsi selesai.
void func() {
int i; /* `i` only exists during `func` */
}
Alokasi memori dinamis sedikit berbeda. Sekarang anda kontrol yang tepat ukuran dan hidup dari lokasi memori. Jika anda don't gratis ini, anda'll mengalami kebocoran memori, yang dapat menyebabkan aplikasi crash, karena pada beberapa titik waktu, sistem tidak dapat mengalokasikan lebih banyak memori.
int* func() {
int* mem = malloc(1024);
return mem;
}
int* mem = func(); /* still accessible */
Di atas contoh, memori yang dialokasikan masih berlaku dan dapat diakses, meskipun fungsi dihentikan. Ketika anda selesai dengan memori, anda harus gratis ini:
free(mem);
Statis alokasi memori: compiler mengalokasikan diperlukan ruang memori untuk menyatakan variable.By menggunakan alamat dari operator,reserved alamat diperoleh dan alamat ini dapat diberikan ke sebuah variabel pointer.Karena sebagian besar menyatakan variabel memiliki statis memori,cara ini menetapkan nilai penunjuk ke pointer adalah variabel yang dikenal sebagai statis alokasi memori. memori yang diberikan pada waktu kompilasi.
Alokasi memori dinamis: menggunakan fungsi malloc( ) atau calloc( ) untuk mendapatkan memori secara dinamis.Jika fungsi-fungsi ini digunakan untuk mendapatkan memori secara dinamis dan nilai-nilai yang dikembalikan oleh fungsi-fungsi ini assingned untuk pointer variabel, seperti tugas-tugas yang dikenal sebagai alokasi memori dinamis.memori adalah assined selama jangka waktu.
Statis Alokasi Memori:
Alokasi Memori Dinamis:
Perbedaan antara ALOKASI MEMORI STATIS & ALOKASI MEMORI DINAMIS
Memori yang dialokasikan sebelum eksekusi program dimulai (Selama Kompilasi). Memori yang dialokasikan selama pelaksanaan program.
Tidak ada alokasi memori atau deallocation tindakan yang dilakukan selama Eksekusi. Memori Binding dibentuk dan dihancurkan saat Eksekusi.
Variabel tetap dialokasikan secara permanen. Dialokasikan hanya ketika program unit aktif.
Diimplementasikan dengan menggunakan tumpukan dan tumpukan. Diimplementasikan dengan menggunakan data segmen.
Pointer yang dibutuhkan untuk mengakses variabel. Tidak perlu dialokasikan secara Dinamis pointer.
Eksekusi lebih cepat dari yang Dinamis. Eksekusi lambat dari yang statis.
Lebih banyak Ruang memori yang diperlukan. Ruang Memori kurang diperlukan.
Statis alokasi memori. Memori yang dialokasikan akan di stack.
int a[10];
Alokasi memori dinamis. Memori yang dialokasikan akan di tumpukan.
int *a = malloc(sizeof(int) * 10);
dan yang terakhir harus gratisd karena tidak ada Garbage Collector(GC) di C.
free(a);