12
votes

Désactivation des limites Vérification des vecteurs C ++

avec stl :: vecteur: xxx

est un moyen de désactiver la vérification des limites sans avoir à réécrire tout à () comme [] < / code>? J'utilise la bibliothèque GNU Standard C ++.

EDIT : J'ai changé at () à [] 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.


6 commentaires

À quelle fin? Il peut y avoir une meilleure façon.


Vous devriez pouvoir utiliser une expression régulière pour remplacer at () avec [] 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 [] . Sinon, laissez-le être.


@Adam: Et pas tous les à 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 :)


8 Réponses :


15
votes

non. La vérification des limites de std :: vecteur :: a 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.


0 commentaires

3
votes

pas une manière standard. Vous pouvez éteindre des exceptions dans votre compilateur. Vous pouvez le faire avec GCC avec -fno-exceptions .

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 .


0 commentaires

6
votes

Peut-être qu'une meilleure solution consiste à utiliser [] et à utiliser la mise en œuvre cochée de la bibliothèque standard pour débogage.


0 commentaires

25
votes

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 at () s xxx p> Et si vous voulez garder at () pour le développement et l'utilisation opérateur [] dans la production, il suffit de l'envelopper dans un #Ifdef .

et si vous avez d'autres at () s Vous pouvez toujours modifier votre #include d fichier .


1 commentaires

+1 tard à la fête, mais portant d'excellents conseils. Ceci est définitivement la voie rapide et sale de profiler quelque chose.



0
votes

Si vous avez des modèles d'accès raisonnablement cohérents (c.-à-d. Accès aléatoire), plutôt que d'utiliser at () ou [] , une approche pour éviter la vérification de la plage est de Utilisez des itérateurs, en utilisant commencer () , fin () et avance () ou même mieux, à l'aide des algorithmes standard. < / p>

Bien que cela ne résout pas le problème sous-jacent de la correction de la correction AT () 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


0 commentaires

5
votes

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) = ...;


1 commentaires

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 .



2
votes

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.

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ù.


1 commentaires

-1: Ne jamais hériter de types stl, ils manquent de destructeurs virtuels.



3
votes

Utilisez at () Lorsque vous toujours 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 [] , mais les algorithmes qui utilisent ceci doivent être minutieusement testés car le mode de défaillance est plus grave (comportement non défini).

Quelques approches des limites du mode de développement vérifiant pour [] lors de l'utilisation de GCC sous Linux:


0 commentaires