Le retour à une chaîne vide : efficace en c++
J'ai 2 façons de retourner une chaîne vide à partir d'une fonction.
1)
std::string get_string()
{
return "";
}
2)
std::string get_string()
{
return std::string();
}
lequel est le plus efficace et pourquoi?
- Ni. Utilisation
return {};
. - Et comment est-ce lié à C?
- Cela tombe dans le domaine de l'inutile micro-optimisation de votre compilateur d'optimiser loin à l'aide de RVO et copie élision.
- pourriez-vous expliquer pourquoi?
- Parce que c'est direct l'initialisation avec le constructeur par défaut, plutôt que de copier l'initialisation (à partir d'un éventuellement dynamiquement évaluée constructeur). Le constructeur par défaut peuvent être mises en œuvre sans l'allocation de constexpr si votre application est si incliné.
- C'est (peut-être) plus efficace que le premier, car il tout simplement par défaut-les constructions de la chaîne plutôt que de lire la valeur d'une chaîne de caractères littérale; et plus efficace que le deuxième car elle nécessite moins de frappe.
- pas différent, dans la pratique, que de retourner
std::string
. voir ma réponse - "le royaume de l'inutile micro-optimisation" peut-être que c'est la vraie question. Combien ça coûte de créer une chaîne de caractères à partir d'un char * et est-il important?
Vous devez vous connecter pour publier un commentaire.
Réponse originale à cette question:
Fait quelques recherches. Ci-dessous est un exemple de programme et les dispositions pertinentes de l'assemblée:
Code:
Assemblée:
Cela a été compilé avec
-std=c++11 -O2
.Vous pouvez voir qu'il y a beaucoup plus de travail pour le
return "";
déclaration et comparativement faible pourreturn std::string
etreturn {};
(ces deux sont identiques).Comme Frerich Raabe, a déclaré, lors du passage d'un vide
C_string
, il doit encore faire le traitement sur elle, au lieu d'allouer de la mémoire. Il semble que cela ne peut pas être optimisé à l'écart (au moins pas par GCC)Donc la réponse est définitivement utilisation:
ou
Bien que, à moins que vous êtes de retour beaucoup de chaînes vides dans les performances critiques de code (enregistrement, je suppose?), la différence va encore être négligeable.
return {};
est une extension C++, doncreturn std::string();
doit être préféré.La dernière version n'est jamais plus lente que la première. La première version des appels à la
std::string
constructeur prenant une chaîne C, puis calculer la longueur de la chaîne. Même si c'est rapide à faire pour une chaîne vide, ce n'est certainement pas plus rapide que ne pas le faire du tout.std::string
. Je ne pense pas qu'il y a beaucoup (le cas échéant) des compilateurs qui sont assez intelligents pour en déduire que le premier argument du constructeur est l'équivalent du constructeur prenant à la fois un pointeur et une taille, à condition qu'il passe un de moins que la taille de la chaîne littérale (qui a une fuite'\0'
).strlen()
sur une chaîne littérale - j'ai demandé la fonctionnalité sera ajoutée à SparcWorks C++ plus d'une décennie, je ne sais pas si elles l'ont jamais fait cela - GCC déjà fait à l'époque. Encore - je n'aurais pas forcément s'attendre à une implémentation C++ pour utiliserstrlen
... ne sait jamais si.