Apa perbedaan antara array statis dan array dinamis di C ++?
Saya harus melakukan tugas untuk kelas saya dan dikatakan untuk tidak menggunakan array statis, hanya array dinamis. Saya sudah mencari di buku dan online, tapi sepertinya saya tidak mengerti.
Saya pikir statis dibuat pada waktu kompilasi dan dinamis pada waktu proses, tetapi saya mungkin salah mengira ini dengan alokasi memori.
Bisakah Anda menjelaskan perbedaan antara array statis dan array dinamis di C ++?
Jawaban:
Larik lokal dibuat di tumpukan, dan memiliki durasi penyimpanan otomatis - Anda tidak perlu mengelola memori secara manual, tetapi mereka akan dihancurkan ketika fungsinya berakhir. Mereka harus memiliki ukuran tetap:
int foo[10];
Array yang dibuat dengan
operator new[]
memiliki durasi penyimpanan dinamis dan disimpan di heap (secara teknis disebut "penyimpanan gratis"). Mereka dapat memiliki ukuran apa saja, tetapi Anda perlu mengalokasikan dan membebaskannya sendiri karena mereka bukan bagian dari bingkai tumpukan:int* foo = new int[10]; delete[] foo;
sumber
int* foo = new int[N]
yang Anda miliki untukdelete
diri Anda sendiri dan karenanya berhati-hatilah saat ada pengecualian. Array statis tidak memiliki masalah ini.statis adalah kata kunci dalam C dan C ++, jadi daripada istilah deskriptif umum, statis memiliki arti yang sangat spesifik bila diterapkan pada variabel atau larik. Untuk menambah kebingungan, kata ini memiliki tiga arti berbeda dalam konteks yang terpisah. Karena itu, array statis dapat berupa tetap atau dinamis.
Izinkan saya menjelaskan:
Yang pertama adalah khusus C ++:
Dua diwarisi dari C:
dalam suatu fungsi, variabel statis adalah variabel yang lokasi memorinya dipertahankan di antara pemanggilan fungsi. Ini statis karena diinisialisasi hanya sekali dan mempertahankan nilainya di antara pemanggilan fungsi (penggunaan statika membuat fungsi non-reentrant, yaitu bukan threadsafe)
variabel statis yang dideklarasikan di luar fungsi adalah variabel global yang hanya dapat diakses dari dalam modul yang sama (file kode sumber dengan # include lainnya)
Pertanyaan (saya pikir) yang ingin Anda tanyakan adalah apa perbedaan antara array dinamis dan array tetap atau waktu kompilasi. Itu adalah pertanyaan yang lebih mudah, array waktu kompilasi ditentukan sebelumnya (ketika program dikompilasi) dan merupakan bagian dari bingkai tumpukan fungsi. Mereka dialokasikan sebelum fungsi utama dijalankan. array dinamis dialokasikan saat runtime dengan kata kunci "baru" (atau keluarga malloc dari C) dan ukurannya tidak diketahui sebelumnya. alokasi dinamis tidak secara otomatis dibersihkan sampai program berhenti berjalan.
sumber
new[]
operator, bagaimana mungkin ukurannya tidak diketahui hingga runtime? yaituint* p = new int[10]
Saya pikir semantik yang digunakan di kelas Anda membingungkan. Apa yang mungkin dimaksud dengan 'statis' hanyalah "ukuran konstan", dan apa yang mungkin dimaksud dengan "dinamis" adalah "ukuran variabel". Dalam kasus itu, array ukuran konstan mungkin terlihat seperti ini:
int x[10];
dan struktur yang "dinamis" hanyalah jenis struktur apa pun yang memungkinkan penyimpanan yang mendasari ditingkatkan atau dikurangi pada waktu proses. Biasanya,
std::vector
kelas dari pustaka standar C ++ sudah cukup. Gunakan seperti ini:std::vector<int> x(10); // this starts with 10 elements, but the vector can be resized.
std::vector
telahoperator[]
ditentukan, sehingga Anda dapat menggunakannya dengan semantik yang sama sebagai array.sumber
new int[10]
Array statis dialokasikan memori pada waktu kompilasi dan memori dialokasikan pada stack. Sedangkan array dinamis dialokasikan memori pada saat runtime dan memori dialokasikan dari heap.
int arr[] = { 1, 3, 4 }; // static integer array. int* arr = new int[3]; // dynamic integer array.
sumber
Penting untuk memiliki definisi yang jelas tentang arti istilah. Sayangnya tampaknya ada beberapa definisi tentang apa yang dimaksud dengan array statis dan dinamis.
Variabel statis adalah variabel yang ditentukan menggunakan alokasi memori statis . Ini adalah konsep umum yang tidak bergantung pada C / C ++. Di C / C ++ kita dapat membuat variabel statis dengan cakupan global, file, atau lokal seperti ini:
int x[10]; //static array with global scope static int y[10]; //static array with file scope foo() { static int z[10]; //static array with local scope
Variabel otomatis biasanya diimplementasikan menggunakan alokasi memori berbasis tumpukan . Array otomatis dapat dibuat di C / C ++ seperti ini:
foo() { int w[10]; //automatic array
Apa yang dimiliki array ini
x, y, z
, danw
kesamaannya adalah bahwa ukuran untuk masing-masing array tersebut tetap dan ditentukan pada waktu kompilasi.Salah satu alasan penting untuk memahami perbedaan antara array otomatis dan array statis adalah karena penyimpanan statis biasanya diimplementasikan di bagian data (atau bagian BSS ) dari file objek dan kompiler dapat menggunakan alamat absolut untuk mengakses array. yang tidak mungkin dilakukan dengan penyimpanan berbasis tumpukan.
Yang biasanya dimaksud dengan array dinamis bukanlah yang dapat diubah ukurannya tetapi yang diimplementasikan menggunakan alokasi memori dinamis dengan ukuran tetap yang ditentukan pada waktu proses. Di C ++ ini dilakukan dengan menggunakan
new
operator .foo() { int *d = new int[n]; //dynamically allocated array with size n
Tetapi dimungkinkan untuk membuat larik otomatis dengan ukuran perbaikan yang ditentukan saat runtime menggunakan
alloca
:foo() { int *s = (int*)alloca(n*sizeof(int))
Untuk array dinamis sejati, seseorang harus menggunakan sesuatu seperti
std::vector
di C ++ (atau array panjang variabel di C ).Apa yang dimaksud dengan penugasan dalam pertanyaan OP? Saya pikir sudah jelas bahwa apa yang diinginkan bukanlah array statis atau otomatis tetapi yang baik menggunakan alokasi memori dinamis menggunakan
new
operator atau array berukuran tidak tetap menggunakan misstd::vector
.sumber
Menurut saya dalam konteks ini artinya statis dalam arti ukurannya tetap. Gunakan std :: vector. Ini memiliki fungsi resize ().
sumber
Anda bisa memiliki larik dinamis semu di mana ukurannya ditetapkan oleh pengguna pada waktu proses, tetapi kemudian diperbaiki setelah itu.
int size; cin >> size; int dynamicArray[size];
sumber
Array Statis :
Array Dinamis:
sumber
Ya benar, array statis dibuat pada waktu kompilasi dimana array dinamis dibuat pada waktu proses. Sedangkan perbedaan sejauh menyangkut lokasi memorinya, statis terletak di stack dan dinamika dibuat di heap. Segala sesuatu yang ditempatkan di heap memerlukan manajemen memori sampai dan kecuali pengumpul sampah seperti dalam kasus .net framework ada, jika tidak ada risiko kebocoran memori.
sumber
Array statis: Efisiensi. Tidak ada alokasi dinamis atau deallocation diperlukan.
Array yang dideklarasikan dalam C, C ++ dalam fungsi termasuk pengubah statis bersifat statis. Contoh: static int foo [5];
sumber
susunan statis berarti dengan memberikan elemen di sisi array
arar dinamis berarti tanpa memberikan elemen di samping larik
contoh:
char a[10]; //static array char a[]; //dynamic array
sumber