Array DS exige que tous ses membres disposent de la même heure. Java lance ArrayStoreException lorsqu'une tentative a été fait pour stocker le mauvais type d'objet dans un tableau d'objets. Je ne me souviens pas de ce que fait C++.

Est-ce que je comprends bien qu'il est important d'avoir tous les objets du même type dans le tableau car cela garantit un accès constant aux éléments de temps via les deux opérations suivantes:

1) element size * element index = offset
2) array pointer address + offset

Si les objets sont de types différents et par conséquent de tailles différentes, la formule mentionnée ci-dessus ne fonctionnera pas.

4
Max Koretskyi 21 avril 2017 à 11:56

3 réponses

Meilleure réponse

Oui, tu as raison. Tout ce qui est nécessaire pour un accès aléatoire à temps constant.

En outre, vous pouvez avoir un tableau de pointeurs vides si vous souhaitez stocker différents types de données dans un seul tableau. Par exemple en C ++, faites

void * a[N]

a[i] = (void *)(&YourClass)

De même, utilisez Object[] en java.

4
v78 21 avril 2017 à 09:11

Parce que: nous le voulons comme ça.

Ce que je veux dire, c'est que les gens qui utilisent le langage Java (probablement le même pour C ++) utilisent un langage typé statiquement dans un but précis.

Et quand ces personnes commencent à penser au pluriel; ils pensent généralement au pluriel des choses «similaires».

Attention: en Java, tout est un objet, donc vous pouvez toujours déclarer un objet [] et y insérer n'importe quoi. Cordes, nombres, peu importe.

Et cela conduit également à l'autre aspect important: en C ++, votre tableau représente une zone en mémoire. Et vous feriez mieux d'avoir des éléments de même taille dans ce domaine; pour éviter la corruption des données.

En Java, en revanche, un tableau ne pointe pas vers la mémoire brute.

En bref: il existe de réelles différences entre Java et C ++ dans ce contexte (qu'il faut comprendre pour prendre une décision éclairée); et puis il y a la chose «langue» elle-même. En d'autres termes: ce n'est pas Ruby land, où vous mettez simplement des canards, des nombres, des plantes et des sons de charlatans dans la même "liste" sans plus réfléchir.

Réflexion finale, basée sur cette blague du dernier paragraphe: à mes yeux, un tableau est une implémentation des concepts de liste, il s'agit donc d'un ensemble de choses de même nature. Si vous voulez une collection de choses sans rapport, je préfère l'appeler un tuple .

5
GhostCat 21 avril 2017 à 09:24

Le langage C ++ (et le compilateur) nécessite le type des éléments à stocker dans un tableau pour diverses raisons, comme l'arithmétique des pointeurs et l'abonnement au tableau (par exemple x[i]), l'initialisation par défaut des éléments, la gestion des restrictions d'alignement,. ..).

int x[3] = { 1,2,3 };  // array of 3 int values, each being properly aligned concerning processor architecture;
myObjectType objs[10]; // array of 10 objects of type myObjectType, each being default initialised (probably the default constructor), each being properly aligned
myObjectType *objs[10]; // array of 10 pointers to objects of type myObjectType (including subclasses of myObjectType; allowing dynamic binding and polymorphism). Note: all pointers have the same size, the object to which they point may differ insize.

int *intptr = x;
bool isEqual= (intptr[2] == x[2]); // gives true
intptr += 2; // increases the pointer by "2*sizeof(int)" bytes.

Alors, oui, vous avez raison: une des raisons est le calcul des compensations; Mais il y a aussi d'autres raisons, et d'autres problèmes comme l'alignement, la désintégration tableau vers pointeur, la logique d'initialisation par défaut sont probablement plus subtils mais essentiels aussi.

2
Stephan Lechner 21 avril 2017 à 09:18