avec stl :: vecteur: est un moyen de désactiver la vérification des limites sans avoir à réécrire tout à () code> comme
at () code> à
[] code> dans la zone où j'ai soupçonné un goulot d'étranglement et cela a considérablement réduit le temps de calcul. Cependant, étant donné que j'entiens entre développer le code et exécuter des expériences avec elle, j'aimerais activer la vérification des limites pendant le développement et le désactiver lorsque j'exécute les expériences réelles. Je suppose que l'avis de Andrew est la meilleure solution. P> p>
8 Réponses :
non. La vérification des limites de std :: vecteur :: a code> est spécifiée par la norme, et il n'y a pas de mise en œuvre C ++ standard qui peut s'écarter de celle-ci. P>
pas une manière standard. Vous pouvez éteindre des exceptions dans votre compilateur. Vous pouvez le faire avec GCC avec vous devriez méfier de le faire; Vos bibliothèques (y compris les bibliothèques standard) pourraient ne pas jouer bien avec des exceptions éteintes. Vérifiez votre documentation et vos threads tels que Celui-ci sur la liste de diffusion GCC a>. p> -fno-exceptions code>. P>
Peut-être qu'une meilleure solution consiste à utiliser [] code> et à utiliser la mise en œuvre cochée de la bibliothèque standard pour débogage. P>
Si vous voulez vraiment le faire (au moins pour une comparaison de profilage rapide et sale), cela fonctionnera si vous n'avez pas d'autre et si vous avez d'autres at () code> s
at () code> pour le développement et l'utilisation
opérateur [] code> dans la production, il suffit de l'envelopper dans un
#Ifdef code>. p>
at () code> s Vous pouvez toujours modifier votre
#include code> d
+1 tard à la fête, mais portant d'excellents conseils. Ceci est définitivement la voie rapide et sale de profiler quelque chose.
Si vous avez des modèles d'accès raisonnablement cohérents (c.-à-d. Accès aléatoire), plutôt que d'utiliser Bien que cela ne résout pas le problème sous-jacent de la correction de la correction at () code> ou
[] code>, une approche pour éviter la vérification de la plage est de Utilisez des itérateurs, en utilisant
commencer () code>,
fin () code> et
avance () code> ou même mieux, à l'aide des algorithmes standard. < / p>
AT () Code> Contrôle de la plage de la plage Certaines implémentations de la bibliothèque standard (MSVC) ont enregistré des itérateurs pour certains types de constructions p>
Basé sur votre commentaire que vous souhaitez activer / désactiver la vérification des limites, vous pouvez utiliser une fonction de modèle d'emballage:
deref(vec, 10) = ...;
Cela devrait être la réponse acceptée car cela fonctionne bien et ne casse pas de code sans rapport comme la solution d'Andrew Stein avec le #define code>.
Dérivez votre propre classe de vecteur dans votre propre espace de noms comme "non cocheckedvector" et remplacez l'AT () du type de vecteur de base pour utiliser l'index de la matrice. P>
Ensuite, utilisez "Utiliser UNCHCKECKECKEDVector :: Vector" vous permettra de remplacer toutes vos utilisations du vecteur partout. Cela ne fonctionnera pas si vous utilisez des types entièrement qualifiés n'importe où. P>
-1: Ne jamais hériter de types stl, ils manquent de destructeurs virtuels.
Utilisez Quelques approches des limites du mode de développement vérifiant pour activer Mode de débogage GCC A>, voir aussi Vérification constante de GCC STL P>
Exécutez votre programme sous le Valgrind vérificateur de mémoire p>
Une autre discussion intéressante: Vecteur :: at contre vecteur :: opérateur [] p> at () code>
Lorsque vous toujours em> veux vérifier. Notez également que cela jette une exception sur l'erreur, il est donc potentiellement recouvrable. Si vous voulez plus vite, décoché, accessor, utilisez [] code>
, mais les algorithmes qui utilisent ceci doivent être minutieusement testés car le mode de défaillance est plus grave (comportement non défini). P>
[] code> lors de l'utilisation de GCC sous Linux: P>
-d_glibcxx_debug code> p>
li>
Valgrind (votre programme et arguments) CODE> P>
li>
ul>
À quelle fin? Il peut y avoir une meilleure façon.
Vous devriez pouvoir utiliser une expression régulière pour remplacer
at () code> avec
[] code> et définir un point d'arrêt pour aider à vérifier que toutes les instances ont été remplacées. Non que l'on glissant dans une catastrophe, la préoccupation n'est que la performance, non?
Pourquoi voudriez-vous faire cela? Si votre réponse est la performance, alors dites-moi que vous avez profilé et que vous avez constaté que c'était votre goulot d'étranglement. Si tel est le cas, alors oui, réécrivez votre () S comme
[] code>. Sinon, laissez-le être.
@Adam: Et pas tous les
à code> s, juste les points chauds. :-P
@ADAM: Je l'ai profilée avec Oprofile et que le programme utilise beaucoup de temps à LibstDC ++, je tiens donc à vérifier si cela est dû à la vérification des limites. Je veux garder les limites à vérifier pendant le développement, mais éventuellement le désactiver quand je l'exécute réel.
Vous devriez identifier l'emplacement exact du goulot d'étranglement. Peut-être que votre code dépense 80% de temps à Malloc () n'a rien à voir avec les limites vérifiant :)