Comment l’initialisation conditionnelle est-elle gérée et s’agit-il d’une bonne pratique?

J’essaie de choisir entre plusieurs pratiques possibles. Dites, ma fonction a un certain nombre de blocs if (), qui fonctionnent sur des données, qui leur sont propres.

Ou est-ce que je préfère une autre option plus propre? La question est-elle même recevable sous sa forme générale actuelle?

Dois-je déclarer et initialiser les données locales (pour le bloc) à l’intérieur du bloc?

Absolument: cela tend à rendre les programmes plus lisibles.

Cela a-t-il un coût de performance d’exécution (en raison de l’allocation d’exécution dans la stack)?

Non: toutes les affectations sont effectuées à l’avance. L’espace de la stack est réservé aux variables de toutes les twigs lors de la saisie d’une fonction, et non lors de la saisie de la twig. De plus, cela pourrait même vous faire économiser un peu d’espace, car l’espace alloué aux variables dans des twigs ne se chevauchant pas peut être réutilisé par le compilateur.

Ou devrais-je déclarer et / ou initialiser toutes les variables à l’entrée de la fonction, afin que cela soit fait dans un bloc d’opération, éventuellement plus rapide?

Non, ce n’est pas plus rapide et pourrait être légèrement plus coûteux.

Ou devrais-je séparer les blocs if () en différentes fonctions, même si elles ne comptent que quelques lignes et n’en utilisent qu’une seule dans le programme?

Cela aurait probablement un impact négatif sur la lisibilité de votre programme.

C’est une bonne pratique de garder la scope de la variable aussi petite que possible.
Si vous déclarez toutes les variables une fois au début et que vous n’utilisez pas
les souvent dans votre programme. C’est inutile, cela prend plus de mémoire.

De plus, un autre avantage de garder la scope réduite est que vous pouvez le réutiliser
les mêmes noms encore. (vous n’avez pas à inventer de nouveaux noms chaque fois que vous
faire quelque chose de sortingvial).

Parmi les options que vous énoncez, déclarez et initialisez les données locales (pour le bloc) à l’intérieur du bloc sont celles qui serviront votre objective. Oublie le rest des choses.

Pour être complet; Une autre considération, généralement moins importante, est le contrôle de remplissage de la stack, ce qui est intuitivement plus difficile si vous ne déclarez pas tout à l’avance.

Voir cela pour plus d’informations, bien que je mette l’accent sur le paragraphe suivant avant que quiconque fasse une chose folle:

Habituellement, pour le petit nombre de variables scalaires dans vos programmes C, utiliser les quelques octets que vous pouvez obtenir en modifiant l’ordre de déclaration ne vous épargnera pas assez pour être significatif. La technique devient plus intéressante lorsqu’elle est appliquée à des variables non scalaires, en particulier des structures.

Maintenant la réponse concernant les performances.

Dois-je déclarer et initialiser les données locales (pour le bloc) à l’intérieur du bloc? Cela a-t-il un coût de performance d’exécution (en raison de l’allocation d’exécution dans la stack)?

L’atsortingbution de variables locales est pratiquement gratuite. Dans la plupart des cas, ce sera vraiment libre, car la mise à jour du pointeur de stack est effectuée dans la même instruction que celle qui écrit la valeur dans la stack. La désallocation est également gratuite (lorsqu’un élément est sorti de la stack) ou une fois au retour (lorsqu’un cadre de stack a été créé).

Ou devrais-je déclarer et / ou initialiser toutes les variables à l’entrée de la fonction, afin que cela soit fait dans un bloc d’opération, éventuellement plus rapide?

Bien que l’allocation soit pratiquement gratuite, l’exécution de constructeurs / destructeurs ne l’est pas. Bien que cela ne s’applique pas aux variables de types primitifs, il s’applique à pratiquement tous les types définis par l’utilisateur, y compris les pointeurs intelligents et autres. Si vous déclarez un pointeur intelligent au début de la fonction, mais ne l’utilisez que la moitié du temps, vous construisez et par la suite, vous le détruisez deux fois plus que nécessaire.

De même, si vous déclarez une variable pour laquelle vous disposez des informations nécessaires pour l’initialiser à vos besoins, vous pouvez la construire directement dans l’état souhaité, au lieu de la créer par défaut, mais uniquement pour la modifier ultérieurement nombreux cas). Ainsi, du sharepoint vue des performances, vous devez toujours déclarer les variables en retard et uniquement dans les blocs qui en ont besoin.

Ou devrais-je séparer les blocs if () en différentes fonctions, même si elles ne comptent que quelques lignes et n’en utilisent qu’une seule dans le programme?

Non, cela est totalement contre-productif du sharepoint vue des performances. Chaque appel de fonction a un temps système, je pense qu’il se situe entre 10 et 20 cycles la plupart du temps. Vous pouvez faire pas mal de calculs pendant cette période.