Saya ingin tahu apa perbedaan antara alokasi memori statis dan alokasi memori dinamis?
Bisakah Anda menjelaskan ini dengan contoh apa pun?
Saya ingin tahu apa perbedaan antara alokasi memori statis dan alokasi memori dinamis?
Bisakah Anda menjelaskan ini dengan contoh apa pun?
Jawaban:
Ada tiga jenis alokasi - statis, otomatis, dan dinamis.
Alokasi Statis artinya, memori untuk variabel Anda dialokasikan saat program dimulai. Ukurannya tetap saat program dibuat. Ini berlaku untuk variabel global, variabel cakupan file, dan variabel yang memenuhi syarat dengan static
fungsi dalam yang ditentukan.
Alokasi memori otomatis terjadi untuk variabel (non-statis) yang ditentukan di dalam fungsi, dan biasanya disimpan di stack (meskipun standar C tidak mengamanatkan bahwa stack digunakan). Anda tidak perlu mencadangkan memori ekstra untuk menggunakannya, tetapi di sisi lain, juga memiliki kendali terbatas atas masa pakai memori ini. Misalnya: variabel otomatis dalam suatu fungsi hanya ada di sana sampai fungsi tersebut selesai.
void func() {
int i; /* `i` only exists during `func` */
}
Alokasi memori dinamis sedikit berbeda. Anda sekarang mengontrol ukuran pasti dan masa pakai lokasi memori ini. Jika Anda tidak membebaskannya, Anda akan mengalami kebocoran memori, yang dapat menyebabkan aplikasi Anda macet, karena pada suatu titik waktu, sistem tidak dapat mengalokasikan lebih banyak memori.
int* func() {
int* mem = malloc(1024);
return mem;
}
int* mem = func(); /* still accessible */
Pada contoh atas, memori yang dialokasikan masih valid dan dapat diakses, meskipun fungsinya dihentikan. Ketika Anda selesai dengan memori, Anda harus membebaskannya:
free(mem);
Ini adalah pertanyaan wawancara standar:
Apakah memori dialokasikan saat runtime menggunakan calloc()
, malloc()
dan teman. Terkadang juga disebut sebagai memori 'heap', meskipun tidak ada hubungannya dengan struktur data heap ref .
int * a = malloc(sizeof(int));
Memori heap bertahan hingga free()
dipanggil. Dengan kata lain, Anda mengontrol umur variabel.
Inilah yang umumnya dikenal sebagai memori 'tumpukan', dan dialokasikan saat Anda memasuki cakupan baru (biasanya saat fungsi baru didorong di tumpukan panggilan). Setelah Anda keluar dari ruang lingkup, nilai alamat memori otomatis tidak ditentukan, dan mengaksesnya adalah kesalahan .
int a = 43;
Perhatikan bahwa ruang lingkup tidak selalu berarti fungsi. Cakupan bisa bersarang di dalam suatu fungsi, dan variabel hanya akan berada dalam cakupan di dalam blok tempat ia dideklarasikan. Perhatikan juga bahwa di mana memori ini dialokasikan tidak ditentukan. (Pada sistem yang waras, itu akan ada di tumpukan, atau mendaftar untuk pengoptimalan)
Dialokasikan pada waktu kompilasi * , dan masa pakai variabel dalam memori statis adalah masa pakai program .
Di C, memori statis dapat dialokasikan menggunakan static
kata kunci. Cakupannya hanya unit kompilasi.
Segalanya menjadi lebih menarik ketika extern
kata kunci dipertimbangkan . Ketika sebuah extern
variabel didefinisikan , kompilator mengalokasikan memori untuknya. Ketika sebuah extern
variabel dideklarasikan , compiler mengharuskan variabel tersebut didefinisikan di tempat lain. Kegagalan mendeklarasikan / mendefinisikan extern
variabel akan menyebabkan masalah penautan, sedangkan kegagalan untuk mendeklarasikan / mendefinisikan static
variabel akan menyebabkan masalah kompilasi.
dalam ruang lingkup file, kata kunci statis adalah opsional (di luar fungsi):
int a = 32;
Tapi tidak dalam ruang lingkup fungsi (di dalam fungsi):
static int a = 32;
Secara teknis, extern
dan static
dua kelas variabel yang terpisah di C.
extern int a; /* Declaration */
int a; /* Definition */
Agak membingungkan untuk mengatakan bahwa memori statis dialokasikan pada waktu kompilasi, terutama jika kita mulai mempertimbangkan bahwa mesin kompilasi dan mesin host mungkin tidak sama atau bahkan mungkin tidak menggunakan arsitektur yang sama.
Mungkin lebih baik untuk berpikir bahwa alokasi memori statis ditangani oleh kompilator daripada dialokasikan pada waktu kompilasi .
Misalnya kompilator dapat membuat data
bagian besar dalam biner yang dikompilasi dan ketika program dimuat di memori, alamat di dalamdata
segmen program akan digunakan sebagai lokasi dari memori yang dialokasikan. Ini memiliki kelemahan yang nyata yaitu membuat biner yang dikompilasi menjadi sangat besar jika menggunakan banyak memori statis. Dimungkinkan untuk menulis biner multi-gigabyte yang dihasilkan dari kurang dari setengah lusin baris kode. Pilihan lainnya adalah kompilator memasukkan kode inisialisasi yang akan mengalokasikan memori dengan cara lain sebelum program dijalankan. Kode ini akan bervariasi sesuai dengan platform dan OS target. Dalam praktiknya, kompiler modern menggunakan heuristik untuk memutuskan opsi mana yang akan digunakan. Anda dapat mencobanya sendiri dengan menulis program C kecil yang mengalokasikan array statis besar dari item 10k, 1m, 10m, 100m, 1G atau 10G. Bagi banyak penyusun, ukuran biner akan terus bertambah secara linier dengan ukuran larik, dan melewati titik tertentu,
Kelas memori terakhir adalah variabel 'register'. Seperti yang diharapkan, variabel register harus dialokasikan pada register CPU, tetapi keputusan sebenarnya diserahkan kepada compiler. Anda tidak boleh mengubah variabel register menjadi referensi dengan menggunakan address-of.
register int meaning = 42;
printf("%p\n",&meaning); /* this is wrong and will fail at compile time. */
Kebanyakan kompiler modern lebih pintar daripada Anda dalam memilih variabel mana yang harus dimasukkan ke dalam register :)
int * a = malloc(sizeof(*a));
sebagai gantinya, untuk menghindari pengulangan tipe a
. Ini membuat segalanya lebih mudah jika ada jenis a
perubahan.
Alokasi Memori Statis:
Alokasi Memori Dinamis:
Alokasi memori statis: Kompilator mengalokasikan ruang memori yang diperlukan untuk variabel yang dideklarasikan. Dengan menggunakan alamat operator, alamat yang dicadangkan diperoleh dan alamat ini dapat ditugaskan ke variabel pointer. Karena sebagian besar variabel yang dideklarasikan memiliki memori statis, ini cara menetapkan nilai pointer ke variabel pointer dikenal sebagai alokasi memori statis. memori diberikan selama waktu kompilasi.
Alokasi memori dinamis: Menggunakan fungsi seperti malloc () atau calloc () untuk mendapatkan memori secara dinamis.Jika fungsi ini digunakan untuk mendapatkan memori secara dinamis dan nilai yang dikembalikan oleh fungsi ini ditetapkan ke variabel penunjuk, penetapan tersebut dikenal sebagai memori dinamis alokasi.memory ditetapkan selama run time.
Perbedaan antara ALOKASI MEMORI STATIK & ALOKASI MEMORI DINAMIS
Memori dialokasikan sebelum eksekusi program dimulai (Selama Kompilasi).
Memori dialokasikan selama eksekusi program.
Tidak ada alokasi memori atau tindakan deallocation yang dilakukan selama Eksekusi.
Memory Binding dibuat dan dihancurkan selama Eksekusi.
Variabel tetap dialokasikan secara permanen.
Dialokasikan hanya jika unit program aktif.
Diterapkan menggunakan tumpukan dan tumpukan.
Diterapkan menggunakan segmen data.
Pointer diperlukan untuk mengakses variabel.
Tidak perlu pointer yang dialokasikan secara dinamis.
Eksekusi lebih cepat dari Dynamic.
Eksekusi lebih lambat dari statis.
Lebih banyak ruang memori diperlukan.
Lebih sedikit ruang memori yang dibutuhkan.
Alokasi memori statis dialokasikan memori sebelum mengeksekusi program pf selama waktu kompilasi. Alokasi memori dinamis adalah memori yang dialokasikan selama eksekusi program pada saat dijalankan.