Sejak std::list
dan std::vector
ada, apakah ada alasan untuk menggunakan array C tradisional di C ++, atau haruskah mereka dihindari, sama seperti malloc
?
Sejak std::list
dan std::vector
ada, apakah ada alasan untuk menggunakan array C tradisional di C ++, atau haruskah mereka dihindari, sama seperti malloc
?
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).
Jelas, meskipun dengan std::array
C ++ 11, praktis hanya untuk data statis. Array gaya C memiliki tiga keunggulan penting dibandingkan
std::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:
template <typename T, int dims>
class Point
{
T myData[dims];
// ...
};
Biasanya, orang mungkin membayangkan yang dims
akan sangat kecil (2 atau 3),
T
tipe built-in ( double
), dan Anda mungkin berakhir
std::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:
struct Data { int i; char const* s; };
Data const ourData[] =
{
{ 1, "one" },
{ 2, "two" },
// ...
};
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.
int i[] = { 1, 2, 3 };
terus bekerja dengan int i[] = { 1, 2, 3, 4 };
. array<int, 3>
perlu diubah secara manual menjadi array<int, 4>
.
make_array
fungsi , mirip dengan make_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.
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.
std::array<T>
mengalokasikan pada tumpukan dan pada dasarnya tidak memiliki overhead pada array mentah.
array
di c++
memberi Anda alternatif ukuran tetap cepat dari ukuran dinamis std::vector
dan std::list
. std :: array adalah salah satu penambahan pada c++11
. Ini memberikan manfaat dari kontainer std sambil tetap menyediakan semantik tipe agregat dari array gaya C.
Jadi c++11
saya pasti akan menggunakan std::array
, di mana diperlukan, lebih dari vektor. Tapi saya akan menghindari array gaya C di C++03
.
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.
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.
Saya akan mengatakan array masih berguna, jika Anda menyimpan sejumlah kecil data statis, mengapa tidak.
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 bahwa vector
tidak dapat melewatkan kepemilikan datanya, kecuali kompiler Anda mendukung C ++ 11 dan memindahkan konstruktor.
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.
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:
std::string foo;
// fill foo with stuff
myExternalOutputProc(foo.c_str());
adalah solusi yang sangat bagus tetapi tidak
std::string foo;
// fill foo with stuff
myExternalOutputProc(&foo);
Alasannya adalah bahwa std :: string dapat diimplementasikan dengan banyak cara berbeda tetapi string gaya-c selalu merupakan string gaya-c.