Apa dan di mana tumpukan dan tumpukan itu?

Buku-buku dalam bahasa pemrograman menjelaskan bahwa tipe nilai dibuat di stack , dan tipe referensi dibuat di heap , tanpa menjelaskan apa dua hal ini. Saya belum membaca penjelasan yang jelas untuk ini. Saya mengerti apa itu stack. Tapi

  • di mana dan apa mereka (secara fisik dalam memori komputer nyata)?
  • Sejauh mana mereka dikendalikan oleh sistem operasi atau bahasa?
  • Berapa volume mereka?
  • Apa yang menentukan ukuran masing-masing?
  • Apa yang membuat lebih cepat?
7380
17 сент. atur mattshane 17 September . 2008-09-17 07:18 '08 pada 7:18 pagi 2008-09-17 07:18
@ 25 jawaban

Tumpukan adalah memori yang disisihkan sebagai ruang awal untuk utas eksekusi. Ketika fungsi dipanggil, blok dicadangkan di bagian atas tumpukan untuk variabel lokal dan beberapa kredensial. Ketika fungsi ini kembali, blok menjadi tidak digunakan dan dapat digunakan saat fungsi berikutnya dipanggil. Tumpukan selalu dicadangkan dalam urutan LIFO (yang terakhir dalam urutan pertama); blok cadangan terbaru selalu merupakan blok berikutnya yang akan dirilis. Ini membuatnya lebih mudah untuk melacak tumpukan; melepaskan blok dari tumpukan tidak lebih dari penyesuaian pointer tunggal.

Heap adalah memori yang dialokasikan untuk alokasi dinamis. Berbeda dengan stack, tidak ada templat paksa untuk mengalokasikan dan membebaskan blok dari heap; Anda dapat memilih blok kapan saja dan melepaskannya kapan saja. Ini membuatnya sangat sulit untuk melacak bagian tumpukan yang didistribusikan atau dibebaskan pada waktu tertentu; Ada banyak distributor kustom cum untuk mengatur kinerja tumpukan untuk pola penggunaan yang berbeda.

Setiap utas menerima tumpukan, sementara untuk aplikasi hanya satu tumpukan yang biasanya digunakan (walaupun tidak jarang memiliki beberapa tumpukan untuk berbagai jenis penempatan).

Untuk menjawab pertanyaan Anda secara >

Sejauh mana mereka dikendalikan oleh sistem operasi atau bahasa?

OS mengalokasikan tumpukan untuk setiap utas tingkat sistem saat membuat utas. Biasanya, OS dipanggil oleh lingkungan eksekusi bahasa untuk mengalokasikan tumpukan untuk aplikasi.

Berapa volume mereka?

Tumpukan melekat pada utas, jadi ketika utas keluar dari tumpukan, itu diperbaiki. Tumpukan biasanya dialokasikan ketika aplikasi diluncurkan pada waktu berjalan dan kembali setelah aplikasi (proses teknis) keluar.

Apa yang menentukan ukuran masing-masing?

Ukuran tumpukan diatur saat membuat utas. Ukuran tumpukan diatur ketika aplikasi dimulai, tetapi dapat meningkat sesuai kebutuhan (pengalokasi meminta lebih banyak memori dari sistem operasi).

Apa yang membuat lebih cepat?

Tumpukan lebih cepat karena pola akses membuatnya sepele untuk mengalokasikan dan membebaskan memori dari itu (pointer / integer hanya tumbuh atau menyusut), dan tumpukan memiliki laporan keuangan yang jauh lebih rumit terkait dengan alokasi atau pelepasan. Selain itu, setiap byte dalam tumpukan sering digunakan kembali, yang artinya cenderung ditampilkan dalam cache prosesor, yang membuatnya sangat cepat. Hit kinerja tumpukan lain adalah bahwa tumpukan, yang terutama merupakan sumber daya global, biasanya harus multi-threaded, yaitu Setiap distribusi dan rilis harus - sebagai suatu peraturan, disinkronkan dengan "semua" panggilan heap lainnya dalam program.

Demonstrasi yang jelas: 2019

5436
17 сент. Jawabannya diberikan Jeff Hill 17 September. 2008-09-17 07:52 '08 pada 7:52 pagi 2008-09-17 07:52

Tumpukan

  • Disimpan dalam RAM komputer, sebagai banyak.
  • Variabel yang dibuat pada stack keluar dari ruang lingkup dan secara otomatis dibebaskan.
  • Jauh lebih cepat untuk mengalokasikan dibandingkan dengan variabel di heap.
  • Diimplementasikan dengan struktur data tumpukan aktual.
  • Menyimpan data lokal, mengembalikan alamat yang digunakan untuk melewatkan parameter.
  • Dapat mengalami stack overflow ketika terlalu banyak stack digunakan (kebanyakan dari rekursi tak terbatas atau terlalu dalam, distribusi yang sangat besar).
  • Data yang dibuat pada stack dapat digunakan tanpa pointer.
  • Anda akan menggunakan tumpukan jika Anda tahu persis berapa banyak data yang perlu Anda alokasikan sebelum kompilasi, dan itu tidak terlalu besar.
  • Biasanya ukuran maksimum sudah ditentukan ketika program Anda mulai.

Tumpukan:

border=0
  • Disimpan dalam memori komputer dengan cara yang sama seperti tumpukan.
  • Dalam C ++, variabel dalam heap harus dihancurkan secara manual dan tidak pernah jatuh dari ruang lingkup. Data dibebaskan dengan delete , delete[] atau free .
  • Lebih lambat untuk mengalokasikan dibandingkan dengan variabel dalam tumpukan.
  • Digunakan sesuai permintaan untuk mengalokasikan blok data untuk digunakan oleh program.
  • Dapat mengalami fragmentasi ketika ada banyak alokasi dan pengecualian.
  • Dalam C ++ atau C, data yang dibuat di heap akan ditunjukkan oleh pointer dan masing-masing dialokasikan ke malloc .
  • Mungkin mengalami kegagalan untuk mendistribusikan jika buffer terlalu banyak diperlukan.
  • Anda akan menggunakan banyak jika Anda tidak tahu persis berapa banyak data yang Anda butuhkan saat berjalan atau jika Anda perlu mengalokasikan banyak data.
  • Bertanggung jawab atas kebocoran memori.

Contoh:

2164
17 сент. Jawabannya diberikan oleh Brian R. Bondy 17 sep. 2008-09-17 07:20 '08 pada 7:20 2008-09-17 07:20

Poin paling penting adalah heap dan stack adalah istilah umum untuk metode alokasi memori. Mereka dapat diimplementasikan dengan cara yang berbeda, dan istilah ini berlaku untuk konsep dasar.

  • Dalam tumpukan elemen, elemen ditempatkan satu di atas yang lain dalam urutan di mana mereka ditempatkan di sana, dan Anda hanya dapat menghapus bagian atas (tanpa memiringkan semuanya).

    2019

1294
19 марта '09 в 17:38 2009-03-19 17:38 jawabannya diberikan oleh thomasrutter 19 Maret 2009 di 17:38 2009-03-19 17:38

(Saya menggeser jawaban ini dari pertanyaan lain yang kurang lebih diperdaya olehnya.)

Jawaban untuk pertanyaan Anda adalah implementasi spesifik dan dapat bervariasi di antara kompiler dan arsitektur prosesor. Namun, ini adalah penjelasan yang disederhanakan.

  • Tumpukan dan tumpukan adalah area memori yang dialokasikan dari sistem operasi dasar (seringkali memori virtual, yang dipetakan ke memori fisik sesuai permintaan).
  • Dalam lingkungan multi-utas, setiap utas akan memiliki tumpukan sepenuhnya independen, tetapi mereka akan membagi tumpukan. Akses paralel harus dikontrol pada heap dan tidak mungkin pada stack.

Tumpukan

  • Tumpukan berisi daftar tertaut blok yang digunakan dan gratis. Alokasi tumpukan new ( new atau malloc ) dipenuhi dengan membuat blok yang sesuai dari salah satu blok gratis. Ini memerlukan pembaruan daftar blok di heap. Informasi meta ini tentang blok di heap juga disimpan di heap, sering di area kecil sebelum setiap blok.
  • Seiring bertambahnya tumpukan, blok baru sering dialokasikan dari alamat yang lebih rendah ke alamat yang lebih tinggi. Dengan demikian, Anda dapat menganggap tumpukan sebagai tumpukan blok memori yang tumbuh dalam ukuran saat memori dialokasikan. Jika tumpukan terlalu kecil untuk didistribusikan, ukuran sering dapat ditingkatkan dengan memperoleh lebih banyak memori dari sistem operasi yang mendasarinya.
  • Mengalokasikan dan membebaskan banyak blok kecil dapat meninggalkan tumpukan dalam keadaan di mana ada banyak blok gratis kecil diselingi antara blok yang digunakan. Permintaan untuk mengalokasikan blok besar mungkin gagal, karena tidak ada blok gratis yang cukup besar untuk memenuhi permintaan distribusi, bahkan jika ukuran gabungan blok bebas mungkin cukup besar. Ini disebut heap fragmentasi.
  • Ketika blok bekas yang berdekatan dengan blok bebas dilepaskan, blok bebas baru dapat dikombinasikan dengan blok bebas yang berdekatan untuk membuat blok bebas yang lebih besar yang secara efektif mengurangi fragmentasi timbunan.

2019

681
31 июля '09 в 18:54 2009-07-31 18:54 Jawaban diberikan oleh Martin Liversage 31 Juli 2009 di 18:54 2009-07-31 18:54

Dalam kode berikut C #

var _tmr = window._tmr || (window._tmr = []);_tmr.push({id: "2334768", type: "pageView", start: (new Date()).getTime()});(function (d, w, id) {  if (d.getElementById(id)) return;  var ts = d.createElement("script"); ts.type = "text/javascript"; ts.async = true; ts.id = id;  ts.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//top-fwz1.mail.ru/js/code.js";  var f = function () {var s = d.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ts, s);};  if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); }})(document, window, "topmailru-code");