2010-05-01 5 views
6

Je me demandais s'il y a des avantages à utiliser une fonction membre statique quand il y a un équivalent non statique. Cela entraînera-t-il une exécution plus rapide (à cause de ne pas avoir à se préoccuper de toutes les variables membres), ou peut-être moins d'utilisation de la mémoire (à cause de ne pas être inclus dans toutes les instances)?Avantage d'utiliser une fonction membre statique au lieu d'une fonction membre non statique équivalente?

Fondamentalement, la fonction que je regarde est une fonction d'utilité pour faire tourner un tableau d'entiers représentant des couleurs de pixel un nombre arbitraire de degrés autour d'un point central arbitraire. Il est placé dans ma classe de base de Bullet abstraite, puisque seules les balles l'utiliseront et je ne voulais pas l'overhead de l'appeler dans une classe d'utilité. C'est un peu trop long et utilisé dans chaque classe de balle dérivée, ce qui n'est probablement pas une bonne idée pour l'intégrer. Comment suggéreriez-vous que je définisse cette fonction? En tant que fonction membre statique de Bullet, d'une fonction membre non statique de Bullet, ou peut-être pas en tant que membre de Bullet mais définie en dehors de la classe dans Bullet.h? Quels sont les avantages et les inconvénients de chacun?

Répondre

9

Il n'y a absolument aucune différence de performance entre les fonctions statiques et les fonctions libres. Du point de vue de la conception, il semble que la fonction en question a très peu à voir avec les puces, donc je préférerais le mettre dans une bibliothèque utilitaire quelque part, il n'y a pas de temps d'exécution vous n'avez pas déjà une telle bibliothèque.

En ce qui concerne la question d'origine, si la fonction ne se rapporte manifestement pas à une classe particulière, alors elle devrait être une fonction libre. Tout au plus, il devrait appartenir à un espace de noms, pour contrôler sa portée. Et même si cela concerne une classe, la plupart du temps, je préférerais la fonction gratuite sauf si la fonction nécessite l'accès à des membres privés.

+0

ouais, je ne suis pas vraiment sûr comment fonctionne C++. Je viens d'un arrière-plan Flash et ActionScript a des frais généraux horribles dans les endroits les plus étranges - les fonctions statiques dans les classes utilitaires sont résolues à l'exécution, alors comme Mathsin chaque fois qu'il est utilisé, le joueur doit trouver la classe Math à travers la hashtable. fonction de péché.Heureux d'entendre que C++ au moins a plus de bon sens .. – jonathanasdf

+3

@Zan: les fonctions membres statiques n'ont pas de pointeur 'this'. –

+0

En effet vous avez raison. J'ai lu la ligne à laquelle je répondais: "Il n'y a absolument aucune différence de performance entre les fonctions membres et les fonctions libres." ce qui n'est pas vraiment ce qu'il dit. Ma faute. –

1

Si la méthode doit être dans l'espace de noms de classe mais ne fonctionne pas sur une instance de cette classe (elle n'utilise pas this et n'utilise aucune méthode non statique), elle doit être déclarée static.

En tête, j'ai utilisé des méthodes statiques à quelques reprises quand j'avais une classe qui suivait ses instances. Il a utilisé une liste à double liaison, le constructeur a été inséré et le destructeur a supprimé l'objet de la liste. L'objet lui-même avait les pointeurs précédent et suivant en tant que membres, et les premier et dernier pointeurs étaient des membres statiques, et tous ces pointeurs étaient privés. Toutes les méthodes qui ont fonctionné sur la liste, par ex. recherche ou compte, étaient des méthodes statiques.

3

Typiquement static est utilisé si possible, pour éliminer le besoin d'un objet et éliminer l'argument étranger.

Mais une exception est dans les foncteurs: les classes qui définissent operator() afin que les objets puissent être "appelés" en tant que fonctions. Idiomatiquement, un tel operator() est déclaré à l'intérieur du bloc class {}, ce qui le rend inline. Ensuite, si la fonction est petite, elle est insérée dans la fonction d'appel et le pointeur this est optimisé.

Si la fonction est grande, elle peut ne pas être insérée. Mais le désavantage minuscule d'avoir un argument supplémentaire est probablement éclipsé de toute façon.

Questions connexes