8
votes

std :: vecteur implémentation d'optimisation

Dans le Documentation , je peux voir que std :: Vector est optimisé pour l'efficacité spatiale en effectuant chaque bit booléen occupe un seul bit. De la documentation:

La manière dont STD :: vecteur est rendue efficace de l'espace (ainsi que de l'optimisation du tout) est la mise en œuvre définie.

Cela signifie-t-il que cela dépend de la mise en œuvre du compilateur? Si c'est le cas, où puis-je vérifier si mon compilateur le supporte? Pourquoi ne veulent-ils pas que cela soit soutenu? Cela semble être une implémentation très simple et efficace.

Sinon, qu'est-ce que cela signifie et que signifie-t-il si je veux que cette optimisation ait lieu?

J'utilise TDM GCC Toolset.


5 commentaires

Oui, cela signifie que la mise en œuvre de std :: vecteur est en grande partie jusqu'au compilateur. Il pourrait ne pas être optimisé du tout ou peut être optimisé de manière spécifique à la mise en œuvre. Généralement, vous le découvrez en consultant la documentation de votre compilateur. Avec GCC et d'autres cuillères à outils open-source, je suppose que vous pourriez également consulter le code source. Mais cela ne prend pas seulement plus de travail, ce n'est peut-être pas une très bonne idée, car le code source ne documente que la mise en œuvre, pas le contrat.


Un moyen facile de vérifier si une telle optimisation est fournie consiste à vérifier si std :: vecteur :: référence_type est bool & ou autre chose. Dans ce dernier cas, vous avez un type de proxy, qui devrait être autorisé pour la mise en œuvre "optimisée".


@Matteoitalia std :: vecteur :: référence est nécessaire pour être un proxy même si la mise en œuvre ne fait pas réellement emballer les bits.


La spécialisation standardisée de STD :: Vector est largement considérée comme une erreur dans le recul de la communauté. Si vous recherchez un ensemble de bits normalisé, je pense qu'il serait sage de considérer std :: bitset


Une question connexe est Stackoverflow.com/q/14326754/3235496


3 Réponses :


0
votes

Il est dépendant de la mise en œuvre et non portable. Il semble avoir des défauts de conception et vous éviterez d'utiliser vecteur . Vous pouvez obtenir plus de détails de Meyers '"Efficace STL, point 18".

Si vous vous souciez vraiment de l'efficacité spatiale, vous pouvez utiliser std :: bitset à la place.


2 commentaires

Malheureusement, je ne peux pas utiliser std :: bitset car j'ai besoin d'initialisation dynamique.


FWIW, Boost a un dynamic_bitset , mais parfois boost pourrait être une overcilleuse. Si vous savez comment l'utiliser, std :: vecteur n'est-ce pas si mauvais, après tout, comme Certains pointent sur .



3
votes

Mise en œuvre définie signifie que cela dépend de ce qui constitue les paramètres de la machine abstraite. (C'est-à-dire que les algorithmes qui définissent votre système d'exploitation hôte, leurs spécifications de mise en œuvre et leurs appels système). Un Q & A informatif sur quelle "mise en œuvre définie" signifie ici .

Plus que probablement, si vous avez une machine moderne avec un compilateur / IDE moderne, il prend en charge la définition de la mise en œuvre.

Si un compilateur ne le supporte pas, ce n'est pas probable parce qu'ils ne "veulent pas", mais parce que c'est soit un très vieux compilateur, soit une machine très limitée de ressources.

Cela se résume à sa machine dépendante de la machine; Donc différents systèmes d'exploitation géreront leur accomplir leur propre manière. (C'est-à-dire 32 bits contre 64 bits, etc.) Cela n'affecte pas la portabilité, sauf si vous travaillez avec un compilateur (très ancien). Vous pouvez vérifier les spécifications de la version du compilateur s'il s'agit d'une préoccupation, qui se trouve facilement en ligne en recherchant votre compilateur et sa version.


0 commentaires

2
votes

La définition de langue formelle ne veut pas exclure des implémentations raisonnables, ils doivent donc toujours être un peu prudents.

Par exemple, une construction de débogage typique est toujours conforme aux normes, mais je pouvais très bien voir un vecteur ne pas être compressé en mode de débogage.

Maintenant, ce n'est pas non spécifié mais implémentation définie . Cela signifie que le fait que ce soit compressé devrait être dans la documentation des compilateurs quelque part, mais la norme ne décrit pas la manière dont la documentation doit être organisée.

Si votre compilateur ne le supporte pas comme vous le souhaitez, vous pouvez simplement utiliser une autre bibliothèque (Boost étant le candidat évident). vecteur n'est généralement pas une classe qui dépend de la magie de compilateur profond, de sorte que les alternatives sont faciles à écrire.


0 commentaires