Pendeknya
Tumpukan digunakan untuk alokasi memori statis dan tumpukan untuk alokasi memori dinamis, keduanya disimpan dalam RAM komputer.
Secara terperinci
Tumpukan
Tumpukan adalah struktur data "LIFO" (last in, first out), yang dikelola dan dioptimalkan oleh CPU dengan cukup dekat. Setiap kali suatu fungsi mendeklarasikan variabel baru, ia "didorong" ke stack. Kemudian setiap kali suatu fungsi keluar, semua variabel yang didorong ke stack oleh fungsi itu, dibebaskan (artinya, mereka dihapus). Setelah variabel tumpukan dibebaskan, wilayah memori tersebut menjadi tersedia untuk variabel tumpukan lainnya.
Keuntungan menggunakan stack untuk menyimpan variabel, adalah memori dikelola untuk Anda. Anda tidak perlu mengalokasikan memori dengan tangan, atau membebaskannya setelah Anda tidak membutuhkannya lagi. Terlebih lagi, karena CPU mengatur memori tumpukan dengan sangat efisien, membaca dari dan menulis ke variabel tumpukan sangat cepat.
Lebih banyak dapat ditemukan di sini .
Heap
Tumpukan adalah wilayah memori komputer Anda yang tidak dikelola secara otomatis untuk Anda, dan tidak begitu ketat dikelola oleh CPU. Ini adalah wilayah memori yang lebih bebas mengambang (dan lebih besar). Untuk mengalokasikan memori pada heap, Anda harus menggunakan malloc () atau calloc (), yang merupakan fungsi C bawaan. Setelah Anda mengalokasikan memori pada heap, Anda bertanggung jawab untuk menggunakan free () untuk membatalkan alokasi memori setelah Anda tidak membutuhkannya lagi.
Jika Anda gagal melakukan ini, program Anda akan memiliki apa yang dikenal sebagai kebocoran memori. Artinya, memori pada heap masih akan disisihkan (dan tidak akan tersedia untuk proses lain). Seperti yang akan kita lihat di bagian debugging, ada alat bernama Valgrind yang dapat membantu Anda mendeteksi kebocoran memori.
Berbeda dengan stack, heap tidak memiliki batasan ukuran pada ukuran variabel (terlepas dari batasan fisik komputer Anda). Memori tumpukan sedikit lebih lambat untuk dibaca dan ditulis, karena kita harus menggunakan pointer untuk mengakses memori pada tumpukan. Kami akan segera berbicara tentang petunjuk.
Berbeda dengan stack, variabel yang dibuat di heap dapat diakses oleh fungsi apa saja, di mana saja di program Anda. Variabel tumpukan pada dasarnya bersifat global.
Lebih banyak dapat ditemukan di sini .
Variabel yang dialokasikan pada tumpukan disimpan langsung ke memori dan akses ke memori ini sangat cepat, dan alokasi tersebut ditangani ketika program dikompilasi. Ketika suatu fungsi atau metode memanggil fungsi lain yang pada gilirannya memanggil fungsi lain, dll., Pelaksanaan semua fungsi tersebut tetap ditunda sampai fungsi terakhir mengembalikan nilainya. Tumpukan selalu dicadangkan dalam urutan LIFO, blok yang paling terakhir dipesan selalu blok berikutnya yang akan dibebaskan. Ini membuatnya sangat sederhana untuk melacak tumpukan, membebaskan blok dari tumpukan tidak lebih dari menyesuaikan satu pointer.
Variabel yang dialokasikan pada heap memiliki alokasi memori pada saat run time dan mengakses memori ini sedikit lebih lambat, tetapi ukuran heap hanya dibatasi oleh ukuran memori virtual. Elemen tumpukan tidak memiliki ketergantungan satu sama lain dan selalu dapat diakses secara acak kapan saja. Anda dapat mengalokasikan blok kapan saja dan membebaskannya kapan saja. Ini membuatnya jauh lebih kompleks untuk melacak bagian mana dari tumpukan yang dialokasikan atau gratis pada waktu tertentu.
Anda dapat menggunakan tumpukan jika Anda tahu persis berapa banyak data yang perlu Anda alokasikan sebelum waktu kompilasi, dan itu tidak terlalu besar. Anda dapat menggunakan tumpukan jika Anda tidak tahu persis berapa banyak data yang akan Anda butuhkan saat runtime atau jika Anda perlu mengalokasikan banyak data.
Dalam situasi multi-utas, masing-masing utas akan memiliki tumpukan mandiri sepenuhnya, tetapi mereka akan berbagi tumpukan. Tumpukan adalah utas khusus dan tumpukan adalah spesifik aplikasi. Tumpukan penting untuk dipertimbangkan dalam penanganan pengecualian dan eksekusi ulir.
Setiap utas mendapat tumpukan, sementara biasanya hanya ada satu tumpukan untuk aplikasi (meskipun tidak jarang memiliki banyak tumpukan untuk berbagai jenis alokasi).
Pada saat run-time, jika aplikasi membutuhkan lebih banyak tumpukan, ia dapat mengalokasikan memori dari memori bebas dan jika stack membutuhkan memori, ia dapat mengalokasikan memori dari memori yang dialokasikan memori bebas untuk aplikasi tersebut.
Bahkan, lebih banyak detail diberikan di sini dan di sini .
Sekarang datang ke jawaban pertanyaan Anda .
Sejauh mana mereka dikendalikan oleh runtime OS atau bahasa?
OS mengalokasikan tumpukan untuk setiap utas tingkat sistem saat utas dibuat. Biasanya OS dipanggil oleh runtime bahasa untuk mengalokasikan heap untuk aplikasi.
Lebih banyak dapat ditemukan di sini .
Apa ruang lingkup mereka?
Sudah diberikan di atas.
"Anda dapat menggunakan tumpukan jika Anda tahu persis berapa banyak data yang perlu Anda alokasikan sebelum waktu kompilasi, dan itu tidak terlalu besar. Anda dapat menggunakan tumpukan jika Anda tidak tahu persis berapa banyak data yang akan Anda butuhkan saat runtime atau jika Anda perlu mengalokasikan banyak data. "
Lebih banyak dapat ditemukan di sini .
Apa yang menentukan ukuran masing-masing?
Ukuran tumpukan diatur oleh OS saat utas dibuat. Ukuran heap diatur pada startup aplikasi, tetapi bisa bertambah sesuai ruang yang dibutuhkan (pengalokasi meminta lebih banyak memori dari sistem operasi).
Apa yang membuat seseorang lebih cepat?
Alokasi tumpukan jauh lebih cepat karena yang dilakukannya hanyalah memindahkan penunjuk tumpukan. Menggunakan kumpulan memori, Anda bisa mendapatkan kinerja yang sebanding dari alokasi tumpukan, tetapi itu datang dengan sedikit kompleksitas tambahan dan sakit kepala sendiri.
Juga, tumpukan vs tumpukan tidak hanya pertimbangan kinerja; itu juga memberi tahu Anda banyak tentang umur objek yang diharapkan.
Detail dapat ditemukan dari sini .