Sejak std::list
dan std::vector
ada, apakah ada alasan untuk menggunakan array C tradisional di C ++, atau haruskah mereka dihindari, sama seperti malloc
?
c++
arrays
conventions
Andreas
sumber
sumber
Jawaban:
Dalam C ++ 11 mana
std::array
tersedia, jawabannya adalah "ya, array harus dihindari". Sebelum C ++ 11, Anda mungkin perlu menggunakan larik C untuk mengalokasikan larik dalam penyimpanan otomatis (yaitu di tumpukan).sumber
Jelas, meskipun dengan
std::array
C ++ 11, praktis hanya untuk data statis. Array gaya C memiliki tiga keunggulan penting dibandingkanstd::vector
:Mereka tidak membutuhkan alokasi dinamis. Untuk alasan ini, array gaya C lebih disukai di mana Anda cenderung memiliki banyak array yang sangat kecil. Katakan sesuatu seperti titik n-dimensi:
Biasanya, orang mungkin membayangkan yang
dims
akan sangat kecil (2 atau 3),T
tipe built-in (double
), dan Anda mungkin berakhirstd::vector<Point>
dengan jutaan elemen. Anda pasti tidak ingin jutaan alokasi dinamis 3 dobel.Dukungan inisialisasi statis. Ini hanya masalah untuk data statis, di mana sesuatu seperti:
Ini sering lebih disukai daripada menggunakan vektor (dan
std::string
), karena ini menghindari semua urutan masalah inisialisasi; data dimuat sebelumnya, sebelum kode aktual apa pun dapat dieksekusi.Terakhir, terkait dengan hal di atas, compiler dapat menghitung ukuran sebenarnya dari array dari penginisialisasi. Anda tidak harus menghitungnya.
Jika Anda memiliki akses ke C ++ 11,
std::array
pecahkan dua masalah pertama, dan sebaiknya digunakan dalam preferensi larik gaya C dalam kasus pertama. Namun, ini tidak membahas yang ketiga, dan memiliki dimensi kompiler array yang sesuai dengan jumlah penginisialisasi masih merupakan alasan yang valid untuk memilih array gaya C.sumber
int i[] = { 1, 2, 3 };
terus bekerja denganint i[] = { 1, 2, 3, 4 };
.array<int, 3>
perlu diubah secara manual menjadiarray<int, 4>
.make_array
fungsi , mirip denganmake_pair
dll. Hat-tip to @R. Martinho Fernandes .std::array
di C ++ 11, [mereka harus digunakan] praktis hanya untuk data statis".Jangan pernah mengatakan "tidak pernah", tetapi saya setuju bahwa peran mereka sangat berkurang oleh struktur data yang sebenarnya dari STL.
Saya juga akan mengatakan bahwa enkapsulasi di dalam objek harus meminimalkan dampak pilihan seperti ini. Jika array adalah anggota data pribadi, Anda dapat menukarnya masuk atau keluar tanpa memengaruhi klien kelas Anda.
sumber
Saya telah mengerjakan sistem keamanan kritis di mana Anda tidak dapat menggunakan alokasi memori dinamis. Memori harus selalu ada di tumpukan. Oleh karena itu dalam kasus ini Anda akan menggunakan array karena ukurannya ditetapkan pada waktu kompilasi.
sumber
std::array<T>
mengalokasikan pada tumpukan dan pada dasarnya tidak memiliki overhead pada array mentah.array
dic++
memberi Anda alternatif ukuran tetap cepat dari ukuran dinamisstd::vector
danstd::list
. std :: array adalah salah satu penambahan padac++11
. Ini memberikan manfaat dari kontainer std sambil tetap menyediakan semantik tipe agregat dari array gaya C.Jadi
c++11
saya pasti akan menggunakanstd::array
, di mana diperlukan, lebih dari vektor. Tapi saya akan menghindari array gaya C diC++03
.sumber
Biasanya, tidak , saya tidak bisa memikirkan alasan untuk menggunakan array mentah, katakanlah
vectors
,. Jika kodenya baru .Anda mungkin harus menggunakan array jika perpustakaan Anda harus kompatibel dengan kode yang mengharapkan array dan pointer mentah.
sumber
vector.data()
di C ++ 11 atau&vector.front()
sebelumnya.Saya tahu banyak orang menunjukkan std :: array untuk mengalokasikan array pada stack, dan std :: vector untuk heap. Tapi tampaknya tidak ada yang mendukung keselarasan non-pribumi. Jika Anda melakukan kode numerik apa pun yang Anda ingin gunakan instruksi SSE atau VPX (sehingga membutuhkan penyejajaran 128 atau 256 byte masing-masing), array C tampaknya masih menjadi pilihan terbaik Anda.
sumber
Saya akan mengatakan array masih berguna, jika Anda menyimpan sejumlah kecil data statis, mengapa tidak.
sumber
Satu-satunya keuntungan dari sebuah array (tentu saja dibungkus dalam sesuatu yang akan mengelola deallokasi secara otomatis saat dibutuhkan) yang
std::vector
dapat saya pikirkan adalah bahwavector
tidak dapat melewatkan kepemilikan datanya, kecuali kompiler Anda mendukung C ++ 11 dan memindahkan konstruktor.sumber
swap
.Array gaya C adalah struktur data fundamental, jadi akan ada kasus ketika lebih baik menggunakannya. Namun, untuk kasus umum, gunakan struktur data yang lebih canggih yang membulatkan sudut data yang mendasarinya. C ++ memungkinkan Anda melakukan beberapa hal yang sangat menarik dan berguna dengan memori, banyak di antaranya bekerja dengan array sederhana.
sumber
std::array
s? Keduanya dalam banyak kasus akan dikompilasi ke perakitan yang sama.std::array
memiliki semantik yang didefinisikan secara tepat yang dibangun di atas array statis.Anda harus menggunakan kontainer STL secara internal, tetapi Anda tidak boleh meneruskan pointer ke kontainer tersebut di antara modul yang berbeda, atau Anda akan berakhir di neraka ketergantungan. Contoh:
adalah solusi yang sangat bagus tetapi tidak
Alasannya adalah bahwa std :: string dapat diimplementasikan dengan banyak cara berbeda tetapi string gaya-c selalu merupakan string gaya-c.
sumber