Puis-je obtenir les meilleures performances pour la création de variables statiques?

Pourquoi certaines personnes font:

char baa(int x) { static char foo[] = " .. "; return foo[x ..]; } 

au lieu de:

 char baa(int x) { char foo[] = " .. "; return foo[x ..]; } 

semble très commun sur les applications de codes source linux. La différence de performance? Si oui, quelqu’un peut-il expliquer pourquoi? Merci d’avance.

Ce n’est pas pour la performance en soi , mais plutôt pour réduire l’utilisation de la mémoire. Il y a une amélioration des performances, mais ce n’est pas (généralement) la principale raison pour laquelle vous voyez un code comme celui-ci.

Les variables d’une fonction sont allouées sur la stack, elles seront réservées et supprimées à chaque appel de la fonction et, ce qui est important, elles seront sockets en compte dans la limite de taille de la stack, ce qui constitue une contrainte sérieuse sur de nombreuses plates-formes intégrées et à ressources limitées.

Cependant, les variables statiques sont stockées dans le segment .BSS ou .DATA (les variables statiques non initialisées de manière explicite iront à .BSS , les variables statiques à initialisation statique iront à .DATA ), en dehors de la stack. Le compilateur peut également en tirer parti pour effectuer certaines optimisations.

Oui, les performances sont différentes: contrairement aux variables de la mémoire automatique initialisées à chaque fois, les variables statiques ne sont initialisées qu’une fois, lors de la première utilisation de la fonction. Si foo n’est pas écrit, il n’y a pas d’autres différences. En cas d’écriture, les modifications apscopes aux variables statiques subsistent entre les appels, tandis que les modifications apscopes aux variables automatiques sont perdues lors de la prochaine utilisation de la fonction.

Dans les implémentations typiques, la version avec static mettra simplement la chaîne quelque part en mémoire au moment de la compilation, tandis que la version sans static fera que la fonction (à chaque fois qu’elle est appelée) alloue de l’espace sur la stack et écrit la chaîne dans cet espace.

La version avec static , donc,

  • est susceptible d’être plus rapide
  • peut utiliser moins de mémoire
  • utilisera moins d’espace de stack (ce qui sur certains systèmes est une ressource rare)
  • jouera mieux avec le cache (ce qui ne sera probablement pas un gros problème pour une petite chaîne, mais pourrait l’être si foo est quelque chose de plus gros).

Définir une variable statique dans une méthode signifie uniquement que la variable n’est pas “publiée”, c’est-à-dire qu’elle conservera sa valeur lors des appels suivants. Cela pourrait conduire à une amélioration des performances en fonction de l’algorithme, mais ce n’est certainement pas une amélioration des performances en soi.

Oui, cela fait une différence, si vous avez déclaré une variable statique:

  1. Premièrement, la mémoire sera allouée soit dans bss, soit dans le segment de données au lieu de la stack.

  2. Deuxièmement, il ne sera initialisé qu’une fois, pas à la différence d’autres variables de fonction, ce qui créera sûrement une différence.

  3. Troisièmement, il conserve sa valeur b / w call calls.Alors en fonction des situations, vous devez l’utiliser.