Dans le Documentation , je peux voir que 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. P>
blockQuote>
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. P>
Sinon, qu'est-ce que cela signifie et que signifie-t-il si je veux que cette optimisation ait lieu? P>
J'utilise TDM GCC Toolset. P> std :: Vector
3 Réponses :
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 Si vous vous souciez vraiment de l'efficacité spatiale, vous pouvez utiliser vecteur
std :: bitset code> à la place. p>
Malheureusement, je ne peux pas utiliser std :: bitset code> 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
Mise en œuvre définie forte> 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 . P >
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. P>
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. P>
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. P>
La définition de langue formelle ne veut pas exclure des implémentations raisonnables, ils doivent donc toujours être un peu prudents. P>
Par exemple, une construction de débogage typique est toujours conforme aux normes, mais je pouvais très bien voir un Maintenant, ce n'est pas non spécifié em> mais implémentation définie em>. 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. P>
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
vecteur
Oui, cela signifie que la mise en œuvre de
std :: vecteur code> 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 code> est
bool & code> 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 code> 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