Je me demandais s'il y a des avantages à utiliser une fonction de membre statique lorsqu'il existe un équivalent non statique. Cela entraînera-t-il une exécution plus rapide (en raison de ne pas avoir à se soucier de toutes les variables de membre), ou peut-être moins d'utiliser la mémoire (en raison de ne pas être incluse dans toutes les instances)? p>
Fondamentalement, la fonction que je regarde est une fonction utilitaire permettant de faire pivoter un réseau entier représentant des couleurs de pixels un nombre arbitraire de degrés autour d'un point central arbitraire. Il est placé dans ma classe de base de balle abstraite, car seules les balles l'utiliseront et je ne voulais pas que les frais générales de l'appeler dans certaines catégories de services publics. C'est un peu trop long et utilisé dans chaque classe de balle dérivée, ce qui ne le rendait probablement pas une bonne idée à la signature. Comment suggéreriez-vous que je définis cette fonction? En tant que fonction de pute statique de la balle, d'une fonction de balle non statique de la balle, ou peut-être pas en tant que membre de la balle mais définie à l'extérieur de la classe dans Bullet.h? Quels sont les avantages et les inconvénients de chacun? P>
4 Réponses :
Il n'y a absolument aucune différence de performance entre les fonctions des membres statiques et les fonctions libres. P>
Dans une perspective de design, on dirait que la fonction en question a très peu de choses à voir avec des balles. Je favoriserais donc la mise dans une bibliothèque utilitaire quelque part, il n'y a pas de frais généraux d'exécution pour ce faire, seul effort de développeur supplémentaire si vous Vous n'avez déjà pas déjà une telle bibliothèque. P>
En ce qui concerne la question initiale, si la fonction ne concerne pas évidemment à une classe particulière, il devrait s'agir d'une fonction libre. Au plus, cela devrait appartenir à un espace de noms, de contrôler sa portée. Et même si cela concerne une classe, la plupart des temps, je préférerais toujours la fonction libre à moins que la fonction nécessite l'accès aux membres privés. P>
Oui, je ne suis pas vraiment sûr de quoi fonctionne C ++. Je viens d'un fond flash et que ActionScript a des frais généraux horribles dans les endroits les plus étranges - les fonctions statiques des classes utilitaires sont résolues au moment de l'exécution, d'une manière mathématique à chaque fois qu'il est utilisé que le joueur doit trouver la classe de mathématiques à travers la haquetable et ensuite trouver le Sin fonction. Heureux d'entendre que c ++ au moins a plus de bon sens ..
En effet vous avez raison. J'ai lu la ligne que je répondais comme "il n'y a absolument aucune différence de performance entre les fonctions des membres et les fonctions libres". Ce qui n'est pas vraiment ce qu'il dit. Ma faute.
"Seulement" effort de développeur supplémentaire
Si la méthode doit être dans l'espace de noms de classe, mais ne fonctionne pas sur une instance de cette classe (c'est-à-dire qu'elle n'utilise pas En haut de ma tête, j'ai utilisé des méthodes statiques quelques fois lorsque j'avais une classe qui a suivi la trace de ses instances. Il a utilisé une liste doublement liée, le constructeur inséré et le destructeur a éliminé l'objet de la liste. L'objet lui-même avait les indicateurs précédents et suivants en tant que membres et les premiers et derniers pointeurs étaient des membres statiques et tous ces indicateurs étaient privés. Toutes les méthodes qui ont fonctionné sur la liste, par exemple rechercher ou compter, étaient des méthodes statiques. P> ceci code> n'utilise aucune méthode non statique), il devrait être déclaré
statique code>. p>
typiquement Mais une exception est dans les foncteurs: classes qui définissent Ensuite, si la fonction est petite, elle est inlinée dans la fonction d'appel et le pointeur Si la fonction est grande, elle peut ne pas être inlinée. Mais le désavantage minuscule d'avoir un argument supplémentaire est probablement nain de toute façon. P> statique code> est utilisé si possible si possible pour éliminer le besoin d'un objet et éliminer le
extraire code> argument p>
opérateur () code> afin que les objets puissent être "appelés" comme des fonctions. Idiomatiquement un tel opérateur
() code> est déclaré à l'intérieur du bloc
Classe {} CODE> Bloc, ce qui le rend
en ligne code>. P>.
CE code> est optimisé. P>
Fonction statique: Avantage: p>
Inconvénient: P>
Par exemple: "Classe Singleton" (avec constructeur privé) est un excellent exemple d'avantage de fonction statique en utilisant. P>