101 votes

Tableau statique et tableau dynamique en C++.

Quelle est la différence entre un tableau statique et un tableau dynamique en C++ ?

Je dois faire un devoir pour ma classe et il est dit de ne pas utiliser de tableaux statiques, seulement des tableaux dynamiques. J'ai regardé dans le livre et sur Internet, mais je n'arrive pas à comprendre.

Je pensais que les éléments statiques étaient créés au moment de la compilation et les éléments dynamiques au moment de l'exécution, mais il se peut que je confonde avec l'allocation de mémoire.

Pouvez-vous expliquer la différence entre un tableau statique et un tableau dynamique en C++ ?

1 votes

La statique n'est pas le contraire de la dynamique. Soit le livre que vous utilisez est mauvais, soit vous le sortez de son contexte. Je vais ajouter une nouvelle réponse ci-dessous pour espérer éclaircir ce point.

3 votes

Voir le diagramme dans cette question : stackoverflow.com/a/11698458/1143274 Les tableaux statiques ne sont pas alloués sur la pile ou le tas.

0 votes

*Tableau fixe et tableau dynamique

115voto

Michael Mrozek Points 44120

Les tableaux locaux sont créés sur la pile, et ont une durée de stockage automatique -- vous n'avez pas besoin de gérer manuellement la mémoire, mais ils sont détruits lorsque la fonction dans laquelle ils se trouvent se termine. Ils ont nécessairement une taille fixe :

int foo[10];

Les tableaux créés avec operator new[] ont une durée de stockage dynamique et sont stockés sur le tas (techniquement le "free store"). Ils peuvent avoir n'importe quelle taille, mais vous devez les allouer et les libérer vous-même puisqu'ils ne font pas partie du cadre de la pile :

int* foo = new int[10];
delete[] foo;

21 votes

C'est correct, mais seulement pour illustrer comment cela fonctionne. S'il vous plaît, ne faites pas cela dans le vrai code et utilisez plutôt un std::vector.

24 votes

@Eddy : La nécessité d'un vecteur dépend de la situation.

7 votes

@Casebash : Dans quelle situation préféreriez-vous un tableau ? "Vous devriez toujours préférer utiliser des vecteurs ou des déques plutôt que des tableaux". - Herb Sutter (C++ plus exceptionnel)

39voto

Joshua Clayton Points 536

Static est un mot-clé en C et C++. Ainsi, plutôt qu'un terme descriptif général, static a une signification très spécifique lorsqu'il est appliqué à une variable ou à un tableau. Pour ajouter à la confusion, ce terme a trois significations distinctes dans des contextes différents. Pour cette raison, un tableau statique peut être soit fixe, soit dynamique.

Laissez-moi vous expliquer :

La première est spécifique au C++ :

  • Un membre de classe statique est une valeur qui n'est pas instanciée avec le constructeur ou supprimée avec le destructeur. Cela signifie que le membre doit être initialisé et maintenu d'une autre manière. Les membres statiques peuvent être des pointeurs initialisés à null et ensuite alloués la première fois qu'un constructeur est appelé. (Oui, ce serait statique et dynamique).

Deux sont héritées de C :

  • Au sein d'une fonction, une variable statique est une variable dont l'emplacement mémoire est conservé entre les appels de fonction. Elle est statique en ce sens qu'elle n'est initialisée qu'une seule fois et qu'elle conserve sa valeur entre les appels de fonction (l'utilisation de la statique rend une fonction non rentable, c'est-à-dire non threadsafe).

  • Les variables statiques déclarées en dehors des fonctions sont des variables globales auxquelles on ne peut accéder qu'à l'intérieur d'un même module (fichier de code source avec tout autre #include).

La question (je pense) que vous vouliez poser est de savoir quelle est la différence entre les tableaux dynamiques et les tableaux fixes ou de compilation. C'est une question plus facile, les tableaux compilés sont déterminés à l'avance (lorsque le programme est compilé) et font partie d'un cadre de pile de fonctions. Ils sont alloués avant l'exécution de la fonction principale. Les tableaux dynamiques sont alloués au moment de l'exécution avec le mot clé "new" (ou la famille malloc du C) et leur taille n'est pas connue à l'avance. Les allocations dynamiques ne sont pas automatiquement nettoyées jusqu'à ce que le programme s'arrête.

4 votes

+1, votre réponse est la plus exacte et précise et aurait dû recevoir plus de votes.

0 votes

Si vous déclarez la taille du tableau avec la balise new[] comment se fait-il que la taille ne soit connue qu'au moment de l'exécution ? int* p = new int[10]

0 votes

"Ils sont alloués avant l'exécution de la fonction principale." Pourquoi allouer les variables de la pile avant l'entrée du bloc concerné ?

11voto

Ben Collins Points 11318

Je pense que la sémantique utilisée dans votre cours prête à confusion. Ce que l'on entend probablement par "statique" est simplement "taille constante", et ce que l'on entend probablement par "dynamique" est "taille variable". Dans ce cas, un tableau de taille constante pourrait ressembler à ceci :

int x[10];

et une structure "dynamique" serait simplement tout type de structure qui permet d'augmenter ou de diminuer le stockage sous-jacent au moment de l'exécution. La plupart du temps, le std::vector de la bibliothèque standard C++ suffira. Utilisez-la comme ceci :

std::vector<int> x(10); // this starts with 10 elements, but the vector can be resized.

std::vector a operator[] défini, vous pouvez donc l'utiliser avec la même sémantique qu'un tableau.

1 votes

Je pense qu'il est assez clair que par "tableau dynamique", ils veulent simplement dire un tableau alloué dynamiquement (c'est-à-dire un tableau dont la taille peut être spécifiée dynamiquement, au moment de l'exécution). Comme new int[10]

0 votes

@jalf : J'étais plus préoccupé par le terme "statique". Je préfère appeler un "tableau dynamique" un tableau alloué ou de taille variable pour des raisons de cohérence.

0 votes

Bon point car un tableau statique peut être automatique et implémenté sur la pile ou être global et implémenté dans une section de données. Les deux sont statiques mais, en interne, le code qui y accède peut être très différent.

9voto

Jagannath Points 2326

Les tableaux statiques se voient allouer de la mémoire au moment de la compilation et la mémoire est allouée sur la pile. Alors que les tableaux dynamiques se voient allouer de la mémoire au moment de l'exécution et la mémoire est allouée à partir du tas.

int arr[] = { 1, 3, 4 }; // static integer array.   
int* arr = new int[3]; // dynamic integer array.

6 votes

Un tableau global est un tableau statique et il est implémenté dans une section de données et non dans la pile.

3voto

Eddy Pronk Points 3084

Je pense que dans ce contexte, cela signifie qu'il est statique dans le sens où la taille est fixe. Utilisez std::vector. Il possède une fonction resize().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X