17 votes

Quelle est la philosophie de gestion de la mémoire en C++?

Quel est le facteur de conception dans la gestion de la mémoire en C++? Par exemple: pourquoi y a-t-il une fuite de mémoire quand un programme ne libère pas un objet mémoire avant de se terminer? Une bonne conception de langage de programmation ne devrait-elle pas maintenir une "foo-table" qui prend en charge cette situation? Je sais que je suis un peu naïf, mais quelle est la philosophie de conception de la gestion de mémoire en C++ par rapport aux classes, aux structures, aux méthodes, aux interfaces, aux classes abstraites?

Évidemment, on ne peut pas se souvenir parfaitement de chaque spécificité du C++. Quel est le moteur principal de la conception de la gestion de la mémoire?

1voto

jalf Points 142628

N'est-ce pas que la conception d'un bon langage de programmation est censée maintenir un "foo-table" qui prend en charge cette situation ?

C'est le cas? Pourquoi? Un bon langage de programmation est celui qui vous permet de résoudre des problèmes, ni plus ni moins. Un ramasse-miettes abaisse certainement la barrière d'entrée, mais il enlève également le contrôle au programmeur, ce qui peut poser problème dans certains cas. Certes, sur un ordinateur quad-core moderne de 2,5 GHz, et avec les ramasse-miettes avancés et efficaces d'aujourd'hui, nous pouvons nous en accommoder. Mais C++ devait fonctionner avec un matériel beaucoup plus limité, allant des ordinateurs de bureau avec un énorme 16 Mo de RAM aux plateformes embarquées avec 16 Ko, et tout ce qu'il y a entre les deux. Il doit être utilisable dans du code en temps réel, où vous ne pouvez pas simplement mettre en pause le programme pendant 0,5 seconde pour exécuter une collecte de déchets.

C++ n'est pas simplement conçu pour être le langage utilisé sur les ordinateurs de bureau. Il est censé être utilisable partout, sur des systèmes à mémoire limitée, dans des scénarios en temps réel stricts, sur de grands supercalculateurs et partout ailleurs.

Le principe directeur de C++ est "vous ne payez pas pour ce que vous n'utilisez pas". Si vous ne voulez pas d'un ramasse-miettes, vous ne devriez pas avoir à payer le (gros) prix d'un tel outil.

Il existe des techniques très puissantes pour gérer la mémoire en C++ et éviter les fuites de mémoire, même sans ramasse-miettes. Si un ramasse-miettes était le seul moyen d'éviter les fuites de mémoire, alors il y aurait un argument solide en faveur de son ajout au langage. Mais ce n'est pas le cas. Vous devez simplement apprendre à gérer correctement la mémoire vous-même en C++.

0voto

Frank Points 16055

Quel est le concept central de la gestion de la mémoire ?

Le concept central (sans jeu de mots) est un peu similaire à celui des voitures à transmission manuelle, par opposition aux voitures à transmission automatique. Comme une voiture à transmission manuelle, C++ vous donne la liberté et le contrôle sur la machine, mais ce n'est pas aussi facile à utiliser que les voitures automatiques qui se chargent de nombreuses tâches pour vous.

Le passage suivant pourrait facilement avoir été écrit à propos de C++ par rapport à Java :

Les personnes qui conduisent des voitures à transmission manuelle connaissent la différence et les avantages d'avoir un contrôle total sur le moteur de leur voiture ; les personnes qui conduisent des voitures à transmission automatique ne le font pas. (...) Les voitures de course, par exemple, n'utilisent pas de transmissions automatiques. (...) Les personnes habituées à changer de vitesses se concentreront davantage sur leur conduite, ce qui la rendra plus efficace et sûre.

http://www.eslbee.com/contrast_stick_shift_or_automatic.htm

Je devrais cependant ajouter que C++ dispose de certains mécanismes qui gèrent la mémoire pour vous, comme d'autres l'ont mentionné, par exemple RAII, smart pointers, etc.

-2voto

Mal Points 59

C++ n'a pas de philosophie de conception en ce qui concerne la mémoire. Tout ce qu'il a, ce sont deux fonctions pour allouer de la mémoire (new malloc) et deux fonctions pour libérer de la mémoire ( delete free ) et quelques fonctions connexes. Même celles-ci peuvent être remplacées par le programmeur.

Cela est dû au fait que C++ vise à fonctionner sur des ordinateurs génériques. Les ordinateurs génériques sont composés d'un processeur, de mémoire (RAM, divers types de ROM) et d'un bus/de bus pour les périphériques. Il n'y a pas de gestion de la mémoire intégrée sur les ordinateurs génériques.

De nos jours, la plupart des ordinateurs sont équipés de mémoire (généralement une variante de ROM) qui contient un BIOS/un moniteur. Là, vous pouvez voir une forme rudimentaire de gestion de la mémoire -- probablement.

Certains ordinateurs sont livrés avec des systèmes d'exploitation qui auront une gestion de la mémoire, mais même là, elle est souvent primitive, et il est facile pour moi d'affirmer que la plupart des ordinateurs exécutant un programme C++ n'ont pas du tout de système d'exploitation.

Si vous attendez de C++ qu'il fonctionne sur n'importe quel ordinateur, il ne peut pas avoir de philosophie de gestion de la mémoire.

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