web-dev-qa-db-fra.com

Comment l'utilisation de «static» affecte-t-elle la vitesse de mon code?

Je résolvais un exercice en ligne et à un moment donné, j'ai dû supprimer le "" du début et de la fin d'une chaîne. C'était mon code:

void static inline process_value(std::string &value) {
    if (value.back() !='>') {
        value = value.substr(1, value.size()-2);
    }
}

Appelé à partir de cette boucle de référence:

static void UsingStatic(benchmark::State& state) {
  // Code inside this loop is measured repeatedly
  for (auto _ : state) {
      std::string valor("\"Hola\"");
      process_valueS(valor);
    // Make sure the variable is not optimized away by compiler
    benchmark::DoNotOptimize(valor);
  }
}

Juste à cause de la curiosité je fait un benchmark .

  • Compilateur: Clang-9.0
  • std: c ++ 20
  • optim: O3
  • STL: libstdc ++ (GNU)

Pendant que j'y étais, j'ai décidé de supprimer static de process_value, Rendant void inline process_value Qui était autrement la même chose. À ma grande surprise, c'était plus lent.

Je pensais que statique signifiait uniquement que la fonction était juste pour un fichier. Mais ici il dit que "" statique "signifie que la fonction doit être insérée par le compilateur si possible". Mais dans ce cas, lorsque j'ai supprimé l'électricité statique, je pense que le résultat n'aurait pas dû changer. Maintenant, je suis confus, qu'est-ce que la statique fait d'autre que la délimitation de la fonction en un seul .cpp, Comment cela affecte-t-il les performances?

Le désassemblage sur QuickBench montre que la boucle NoUsingStatic appelle en fait process_value Au lieu de l'insérer, malgré le mot-clé inline qui autorise le compilateur à le faire. Mais UsingStatic fait en ligne l'appel à process_valueS. Cette différence dans la prise de décision du compilateur explique probablement la différence de performances, mais pourquoi clang choisirait de ne pas insérer une fonction simple déclarée void inline process_value(std::string &value){ ... }?


EDIT: Beacuse la question était fermée parce qu'elle n'était pas assez claire, j'ai supprimé des parties qui n'étaient pas liées à la question. Mais s'il me manque des informations, veuillez me le dire dans les commentaires

7
Pablochaches

inline est juste un conseil au compilateur, qui peut ou non vraiment en ligne avec votre code particulier.

En ce qui concerne le mot clé static, s'il est appliqué à une variable globale, alors il a la portée de fichier (comme vous l'avez mentionné) si vous compilez votre code comme une unité de compilation distincte. Il est donc même possible d'avoir vos variables globales statiques accessibles à partir d'autres fichiers si vous les compilez comme une seule unité de compilation. Cela signifie qu'en réalité, la portée des variables statiques globales n'est pas le fichier mais l'unité de compilation (qui peut ou non être un seul fichier).

Mais, puisque vous avez une fonction statique globale, pas une variable, elle est accessible de partout en tant que fonction statique globale.

EDIT: Comme suggéré par @Peter Cordes dans les commentaires ci-dessous, cela peut être un vrai désordre avec en ligne et statique en même temps, donc le doc officiel ( https://en.cppreference.com/w/cpp/language/inline ) dit que la redéfinition des fonctions en ligne (et des variables depuis C++ 17) doit être non statique.

0
Hack06