Préambule pour les micro-optimiseurs
Rappelles toi:
"Les programmeurs perdent énormément de temps à penser ou à s'inquiéter de la vitesse des parties non critiques de leurs programmes, et ces tentatives d'efficacité ont en fait un fort impact négatif lorsque le débogage et la maintenance sont envisagés. Nous devons oublier les petites économies, par exemple 97% du temps: l' optimisation prématurée est la racine de tous les maux. Pourtant, nous ne devons pas laisser passer nos opportunités dans ces 3% critiques ".
(Merci à la métamorphose pour le devis complet)
N'utilisez pas un tableau C au lieu d'un vecteur (ou autre) simplement parce que vous pensez qu'il est plus rapide car il est censé être de niveau inférieur. Tu aurais tort.
Utilisez le vecteur par défaut (ou le conteneur sécurisé adapté à vos besoins), puis si votre profileur indique qu'il s'agit d'un problème, voyez si vous pouvez l'optimiser, soit en utilisant un meilleur algorithme, soit en changeant de conteneur.
Cela dit, nous pouvons revenir à la question d'origine.
Tableau statique / dynamique?
Les classes de tableaux C ++ se comportent mieux que les tableaux C de bas niveau car elles en savent beaucoup sur elles-mêmes et peuvent répondre aux questions que les tableaux C ne peuvent pas. Ils sont capables de nettoyer après eux-mêmes. Et plus important encore, ils sont généralement écrits à l'aide de modèles et / ou d'inlining, ce qui signifie que ce qui apparaît à beaucoup de code dans le débogage se résout à peu ou pas de code produit dans la version Release, ce qui signifie aucune différence avec leur concurrence intégrée moins sûre.
Dans l'ensemble, il se divise en deux catégories:
Tableaux dynamiques
Utiliser un pointeur vers un tableau malloc-ed / new-ed sera au mieux aussi rapide que la version std :: vector, et beaucoup moins sûr (voir l' article de litb ).
Utilisez donc un std :: vector.
Tableaux statiques
L'utilisation d'un tableau statique sera au mieux:
- aussi rapide que la version std :: array
- et beaucoup moins sûr.
Utilisez donc un std :: array .
Mémoire non initialisée
Parfois, utiliser un vector
au lieu d'un tampon brut entraîne un coût visible car l' vector
initialisation du tampon lors de la construction, alors que le code qu'il remplace ne l'a pas fait, comme l'a remarqué bernie by dans sa réponse .
Si tel est le cas, vous pouvez le gérer en utilisant un unique_ptr
au lieu d'un vector
ou, si le cas n'est pas exceptionnel dans votre ligne de code, écrivez en fait une classe buffer_owner
qui possédera cette mémoire et vous donnera un accès facile et sûr, y compris des bonus comme le redimensionner (en utilisant realloc
?), ou tout ce dont vous avez besoin.