Question

Je suis en train de déterminer si le constructeur boost :: multi_array ou redimensionner méthode peut lancer une exception bad_alloc (ou une autre exception indiquant l'allocation ou redimensionnez n'a pas). Je ne peux pas trouver ces informations dans la documentation partout.

Précision (ajouté de commentaire):

Ceci est une méthode scientifique algorithme qui peut revenir à une moins grande quantité de mémoire (plus lente) si l'allocation échoue. Fondamentalement, il existe deux réseaux 3 dimensions alloués dynamiquement pour maintenir « distances » (corrélation) entre toutes les paires de gènes dans une requête et l'ensemble des gènes dans un ensemble de validation croisée pour chacune d'un grand nombre de jeux de données. La méthode plus lente recalcule chaque distance à la volée comme il est nécessaire. Ceci est une version C d'une implémentation de Java existant, qui mettait en œuvre les méthodes et retomberait sur une exception de mémoire. Je ne pense pas vraiment à manquer de mémoire.

Était-ce utile?

La solution

1er: (répondre à la vraie question): Comme il utilise la mémoire allouée dynamiquement, oui, il peut jeter std::bad_alloc (je ne l'ai jamais vu des exceptions std::bad_alloc de traduction boost, ce serait fou de le faire) .

2 (commentaire sur cet éclaircissement): Vous avez besoin d'informations de la mémoire physique disponible pour optimiser les performances de votre algorithme lors de l'exécution. Cependant, vous ne pouvez pas compter sur std::bad_alloc pour déterminer la quantité de mémoire dont vous disposez, comme les systèmes d'exploitation modernes utilisent une telle chose comme overcommit , ce qui signifie: ils (presque) ne reviennent jamais une tentative d'allocation a échoué, mais seulement vous donner une « mémoire », ce qui ne manquera pas de sauter va à l'existence lorsque vous essayez réellement d'y accéder.

En Java cela peut fonctionner comme la machine virtuelle est en train de faire beaucoup de choses pour vous: il essaie d'allouer des morceaux de mémoire continue, et le fait par rapport à la mémoire physique disponible, et disponible utilisé physique la mémoire de décider si elle doit insister sur le GC plus ou tout simplement allouer une plus grande ordure. En outre, pour des raisons de performance que vous devez prendre en compte que la mémoire virtuelle et la mémoire physique sont des concepts tout à fait différents.

Si vous besoin pour la performance optimizer algorithmes pour de tels cas (ce qui peut être nécessaire, en fonction de votre zone de travail), vous devez vérifier vos fonctions spécifiques à la plate-forme qui peut vous dire comment « le monde réel » ressemble.

Autres conseils

L'absence de spécification explicite exceptions est intentionnel. Voir ce sous-section pour une explication. En outre, noter que l'absence d'une spécification explicite signifie qu'il n'y a aucune restriction sur le type d'exception fonction peut jeter. Ainsi, au moins, la cteur et la fonction de redimensionnement peut lancer des exceptions dans la mémoire de cas est épuisé ou si une copie objet-objet échoue.

Quelques références génériques qui ont inspiré Boost que vous pouvez être intéressé sont:

Pourquoi ne pas le tester? Il est facile de passer une valeur absurdement élevé pour générer l'exception.

D'autre part, qu'allez-vous le faire si ne génère cette exception? std::bad_alloc est le genre d'exception que vous pouvez généralement pas traiter au niveau micro ...

Par exemple, sur un serveur web, vous devez généralement effectuer un nettoyage (rollback transaction sur db?), Puis renvoyer une erreur de 500 à l'utilisateur.

Mais quand la mémoire est épuisée, il n'y a pas que vous pouvez faire en toute sécurité, puisque vous devez faire preuve de prudence si vous ne voulez pas frapper une nouvelle fois le mur de la mémoire que vous connaissez est proche:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top