Cosa succede dietro le quinte?
Un allocazione non dinamica è, per definizione, un contenitore a dimensione fissa di elementi omogenei. Una matrice di N
elementi di tipo T
è disposta in memoria come una sequenza contigua di N
oggetti di tipo T
.
Perché è necessario che l'array abbia un tipo che includa la sua dimensione?
Non credo che sia "necessario" che il tipo di un array includa le sue dimensioni - è un dato di fatto, è possibile utilizzare un puntatore per fare riferimento a una sequenza contigua di T
oggetti. Tale puntatore perderebbe le informazioni sulla dimensione dell'array.
È, tuttavia, una cosa utile da avere. Migliora la sicurezza dei tipi e codifica informazioni utili in fase di compilazione che possono essere utilizzate in più modi. Ad esempio, è possibile utilizzare riferimenti ad array per sovraccaricare array di dimensioni diverse
void foo(int(&array)[4]) { /* ... */ }
void foo(int(&array)[8]) { /* ... */ }
o per capire la dimensione di un array come espressione costante
template <typename T, std::size_t N>
constexpr auto sizeOf(const T(&array)[N]) { return N; }
In che modo ciò influirà sul confronto tra array?
In realtà no.
Non è possibile confrontare matrici di tipo C nello stesso modo in cui si confronterebbero due numeri (ad es. int
Oggetti). Dovresti scrivere una sorta di confronto lessicografico e decidere cosa significa per raccolte di dimensioni diverse. std::vector<T>
prevede che e la stessa logica possa essere applicata agli array.
Bonus: C ++ 11 e versioni successive forniscono std::array
un wrapper attorno a un array in stile C con un'interfaccia simile a un contenitore. Dovrebbe essere preferito agli array in stile C poiché è più coerente con altri contenitori (ad es. std::vector<T>
) E supporta anche confronti lessicografici pronti all'uso .