Perde arkasında neler oluyor?
Dinamik olarak tahsis edilmemiş bir tanım gereği, sabit boyutlu bir homojen eleman konteyneri olmaktadır. Bir N
tür elemanlar dizisi, tipte nesnelerin T
bitişik dizisi olarak hafızaya yerleştirilir .N
T
Dizilerin boyutunu içeren bir türe sahip olması neden gereklidir?
Ben bir dizinin türü boyutunu eklemek için "gerekli" olduğunu sanmıyorum - aslında, T
nesnelerin bitişik bir dizi başvurmak için bir işaretçi kullanabilirsiniz . Böyle bir işaretçi dizi hakkında boyut bilgilerini kaybeder.
Ancak, sahip olmak yararlı bir şeydir. Tip güvenliğini arttırır ve derleme zamanında çeşitli şekillerde kullanılabilecek faydalı bilgileri kodlar. Örnek olarak, farklı boyutlardaki dizilere aşırı yükleme yapmak için dizilere referanslar kullanabilirsiniz
void foo(int(&array)[4]) { /* ... */ }
void foo(int(&array)[8]) { /* ... */ }
veya bir dizinin boyutunu sabit bir ifade olarak bulmak için
template <typename T, std::size_t N>
constexpr auto sizeOf(const T(&array)[N]) { return N; }
Bu, dizileri karşılaştırmayı nasıl etkiler?
Gerçekten değil.
C stili dizileri, iki sayıyı (örneğin, int
nesneleri) karşılaştırdığınız şekilde karşılaştıramazsınız . Bir çeşit sözlükbilimsel karşılaştırma yazmanız ve farklı boyutlardaki koleksiyonlar için ne anlama geldiğine karar vermeniz gerekir. std::vector<T>
bunu sağlar ve dizilere aynı mantık uygulanabilir.
Bonus: C ++ 11 ve üstü, std::array
konteyner benzeri bir arayüze sahip bir C stili dizi etrafında bir sarıcıdır. Diğer kaplarla (örn. std::vector<T>
) Daha tutarlı olduğundan ve aynı zamanda kutudan çıkan sözlükbilimsel karşılaştırmaları desteklediği için C tarzı dizilere tercih edilmelidir .