Ini lebih halus daripada yang disarankan oleh jawaban lain. Tidak ada pemisahan mutlak antara data di tumpukan dan data di heap berdasarkan cara Anda mendeklarasikannya. Sebagai contoh:
std::vector<int> v(10);
Dalam tubuh suatu fungsi, yang menyatakan a vector
(larik dinamis) dari sepuluh bilangan bulat di tumpukan. Namun penyimpanannya dikelola olehvector
tidak ada di tumpukan.
Ah, tapi (jawaban lain menyarankan) masa penyimpanan itu dibatasi oleh masa pakai vector
itu sendiri, yang di sini berbasis tumpukan, jadi tidak ada bedanya bagaimana penerapannya - kita hanya bisa memperlakukannya sebagai objek berbasis tumpukan dengan nilai semantik.
Tidak begitu. Misalkan fungsinya adalah:
void GetSomeNumbers(std::vector<int> &result)
{
std::vector<int> v(10);
// fill v with numbers
result.swap(v);
}
Jadi, apa pun yang memiliki swap
fungsi (dan jenis nilai kompleks apa pun harus memilikinya) dapat berfungsi sebagai referensi rebindable ke beberapa data heap, di bawah sistem yang menjamin satu pemilik data tersebut.
Oleh karena itu, pendekatan C ++ modern adalah tidak pernah menyimpan alamat data heap dalam variabel pointer lokal polos. Semua alokasi heap harus disembunyikan di dalam kelas.
Jika Anda melakukannya, Anda dapat menganggap semua variabel dalam program Anda seolah-olah mereka adalah tipe nilai sederhana, dan melupakan heap sama sekali (kecuali saat menulis kelas pembungkus seperti nilai baru untuk beberapa data heap, yang seharusnya tidak biasa) .
Anda hanya perlu menyimpan satu pengetahuan khusus untuk membantu Anda mengoptimalkan: jika memungkinkan, alih-alih menugaskan satu variabel ke variabel lain seperti ini:
a = b;
tukar mereka seperti ini:
a.swap(b);
karena jauh lebih cepat dan tidak ada pengecualian. Satu-satunya persyaratan adalah Anda tidak perlu b
terus memegang nilai yang sama (ini akan mendapatkan a
nilai, yang akan dibuanga = b
).
Sisi negatifnya adalah pendekatan ini memaksa Anda untuk mengembalikan nilai dari fungsi melalui parameter keluaran, bukan nilai pengembalian yang sebenarnya. Tapi mereka memperbaikinya di C ++ 0x dengan referensi rvalue .
Dalam situasi yang paling rumit dari semuanya, Anda akan membawa ide ini ke ekstrem umum dan menggunakan kelas penunjuk cerdas seperti shared_ptr
yang sudah ada di tr1. (Meskipun saya berpendapat bahwa jika Anda tampaknya membutuhkannya, Anda mungkin telah pindah ke luar sweet spot penerapan Standar C ++.)