8
votes

Avantage d'utiliser une fonction de membre statique au lieu d'une fonction d'élément équivalente non statique?

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)?

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?


0 commentaires

4 Réponses :


11
votes

Il n'y a absolument aucune différence de performance entre les fonctions des membres statiques et les fonctions libres.

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.

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.


3 commentaires

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



1
votes

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 ceci n'utilise aucune méthode non statique), il devrait être déclaré statique .

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.


0 commentaires

3
votes

typiquement statique est utilisé si possible si possible pour éliminer le besoin d'un objet et éliminer le extraire argument

Mais une exception est dans les foncteurs: classes qui définissent opérateur () afin que les objets puissent être "appelés" comme des fonctions. Idiomatiquement un tel opérateur () est déclaré à l'intérieur du bloc Classe {} Bloc, ce qui le rend en ligne . .

Ensuite, si la fonction est petite, elle est inlinée dans la fonction d'appel et le pointeur CE est optimisé.

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.


0 commentaires

0
votes

Fonction statique: Avantage:

  1. On pourrait appeler sans objet réel existant
  2. Les fonctions de membre statique deviennent utiles lorsque vous souhaitez que la classe dans son ensemble ait une fonction, au lieu de chaque objet individuel. Avec une fonction de membre statique, vous pouvez ensuite modifier des données variables statiques.

    Inconvénient:

    1. Il n'a pas de pointeur à un objet réel ("this")

      Par exemple: "Classe Singleton" (avec constructeur privé) est un excellent exemple d'avantage de fonction statique en utilisant.


0 commentaires