Cosa succede dietro le quinte?
Un allocazione non dinamica è, per definizione, un contenitore a dimensione fissa di elementi omogenei. Una matrice di Nelementi di tipo Tè disposta in memoria come una sequenza contigua di Noggetti 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 Toggetti. 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. intOggetti). 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::arrayun 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 .