Généralement, c'est une très bonne pratique de la garder très proche.
Dans certains cas, il y aura un compte de facteurs tels que la performance qui justifie tirant la variable de la boucle.
Dans votre exemple, le programme crée et détruit la chaîne à chaque fois. Certaines bibliothèques utilisent une petite optimisation de la chaîne d'authentification unique (SSO), de sorte que l'allocation dynamique pourrait être évitée dans certains cas.
Supposons que vous vouliez éviter ces redondant créations/allocations, vous l'écrire comme:
for (int counter = 0; counter <= 10; counter++) {
// compiler can pull this out
const char testing[] = "testing";
cout << testing;
}
ou vous pouvez le retirer de la constante:
const std::string testing = "testing";
for (int counter = 0; counter <= 10; counter++) {
cout << testing;
}
Faire la plupart des compilateurs rendre compte que la variable a déjà été déclaré, et il suffit de sauter la partie, ou faut-il vraiment créer une place pour lui dans la mémoire à chaque fois?
Il peut réutiliser l'espace de la variable consomme, et il peut extraire les invariants de boucle. Dans le cas de la const char array (ci-dessus) - que le tableau pourrait être arraché. Toutefois, le constructeur et le destructeur doit être exécutée à chaque itération dans le cas d'un objet (tel qu' std::string
). Dans le cas de l' std::string
, que "l'espace" comporte un pointeur qui contient l'allocation dynamique représentant les personnages. Donc ceci:
for (int counter = 0; counter <= 10; counter++) {
string testing = "testing";
cout << testing;
}
aurait besoin redondant copie dans chaque cas, et l'allocation dynamique et gratuit si la variable se trouve au-dessus du seuil pour l'authentification unique personnage (et de l'authentification unique est mis en œuvre par votre bibliothèque std).
Pour ce faire:
string testing;
for (int counter = 0; counter <= 10; counter++) {
testing = "testing";
cout << testing;
}
aurait encore besoin d'une copie physique du personnage à chaque itération, mais la forme peut résulter en une seule allocation dynamique parce que vous attribuez à la chaîne et de la mise en œuvre devrait voir il n'est pas nécessaire de redimensionner la chaîne de sauvegarde de l'allocation. Bien sûr, vous ne le ferais pas, dans cet exemple (parce que de multiples supérieure alternatives ont déjà été démontré), mais vous pouvez considérer lors de la ficelle ou du vecteur contenu varie.
Alors que voulez-vous faire avec toutes ces options (et plus)? Tenir très près par défaut -- jusqu'à ce que vous comprendre les coûts de bien et de savoir, quand il faut s'écarter.