Je résolvais un problème sur la somme des soumissions, j'ai déclaré mon tableau 2D comme mon code exécuté correctement. Mais quand j'ai vu la solution
J'ai vu ces lignes: p> Je comprends le code. Pourquoi la solution (donnée sur un site Web aléatoire) utilise des pointeurs. Si nous pouvons le faire en utilisant la Déclaration normale ci-dessus. Cela rendra le code plus rapide ou quelque chose? p> p>
3 Réponses :
Cette déclaration exige que les variables Le deuxième problème qui existe est si la taille d'un tableau est trop grande que le compilateur Peut être incapable de créer un tel tableau avec durée de stockage automatique. p> donc si i code> et j code> seraient des constantes de temps de compilation. Les matrices de longueur variable ne sont pas une caractéristique C ++ N standard, bien que certains compilateurs puissent avoir leurs propres extensions de langue, qui incluent cette fonctionnalité. P> i code> et j code> ne sont pas des constantes de compilation ou sont trop grandes alors Vous devez attribuer la mémoire de manière dynamique vous-même ou vous pouvez utiliser le conteneur standard std :: vecteur code>. p> p>
Si nous pouvons le faire en utilisant la déclaration normale ci-dessus. Cela rendra le code plus rapide ou quelque chose? Non tout dans le code ci-dessus, vous créez un tableau dans la pile, il sera supprimé si la fonction hors de portée sera supprimée automatiquement p>
La seconde est créée dans le tas, il sera toujours dans le tas jusqu'à ce que vous le supprimiez par soi-même p>
L'option supérieure peut être beaucoup plus rapide. L'allocation de pile est bon marché et c'est tout un bloc contigu pour que l'utilisation du cache puisse être beaucoup plus efficace. Sur l'inconvénient M * N CODE> peut devenir grand, rapide et souffler sur la pile.
qui est plus rapide: allocation de pile ou allocation de tas . Chaque Nouvelle code> ED L'allocation est un bloc différent quelque part en mémoire et éventuellement à proximité des autres. Cela conduit à Qu'est-ce qu'un code "cache-respect"? . Le troisième point n'est que des mathématiques. Selon la quantité de pile disponible, m code> et n code> d'un couple pourrait causer un trop-plein.
Les deux manières de la déclaration de tableau sont utiles dans des cas d'utilisation différents. La déclaration: déclare un tableau statique et utilise la mémoire de pile pour stocker la matrice ou nous pouvons dire que la mémoire est allouée au moment de l'exécution. Ce type de déclaration de tableau vous oblige à transmettre la valeur 'n' et la taille de la matrice ne peut pas être modifiée après que cela a été déclaré. C'est là qu'il a un inconvénient, car vous ne pouvez pas augmenter la taille si vous souhaitez stocker des éléments supplémentaires. De plus, si vous avez stocké moins d'éléments que 'N', la mémoire restante est gaspillée.
L'autre type de déclaration: p> crée une mémoire allouée de manière dynamique. En d'autres termes, dans ce type d'allocation de la mémoire de déclaration ne se produit que lorsqu'un élément est placé dans la matrice ou au moment de l'exécution.
Cette allocation garantit qu'il n'y a pas de gaspillage de mémoire et stocke les éléments de la matrice dans la mémoire du tas. Mais dans ce type de déclaration, vous devez également modifier la mémoire, sinon cela peut provoquer des fuites de mémoire, car C ++ n'a rien comme un collecteur à ordures. p> p>
Il y a un tas de choses qui changent, par exemple si vous voyez ces tableaux sous forme de matrice, et vous souhaitez échanger la première et la deuxième ligne (par exemple), avec la deuxième solution, vous devez simplement échanger les 2 pointeurs, Dans votre solution, vous ne pouvez pas et vous devez donc échanger chaque élément des 2 rangées.
Ce code devrait (IMHO) simplement utiliser un
std :: vecteur code> en premier lieu et oubliez la gestion de la mémoire manuelle et le non-sens du pointeur. Au moins jusqu'à ce qu'un profileur prouve que le faire est un goulot d'étranglement important.Le
int A [i] [j]; code> utilise une matrice de longueur variable (VLA) qui est pas i> une partie de la langue C ++ (bien que certains compilateurs prennent en charge les VLAS en tant que extension).Parce que
int A [i] [j]; code> n'est pas légal en C ++. Il est frappé ou manque si un compilateur a une extension prenant en charge des tableaux de longueur variable. Cela dit, en utilisantnouveau code> n'est pas bien meilleur. Préfère Utilisez quelque chose comme ça .