6
votes

Puis-je en ligne des méthodes de classe statique dans l'objectif-c?

Vous pouvez déclarer des fonctions comme des inlines comme celle-ci: xxx

de sorte que lorsque vous n'êtes pas en débogage, il n'y a aucun coût à la fonction, car il est optimisé et en ligne. Et si vous voulez avoir la même chose, mais pour une méthode de classe?

Ma classe est déclarée comme ceci: xxx

je veux convertir '< Code> DPRINTF 'dans quelque chose de similaire au en ligne afin qu'il n'y ait aucun coût pour invoquer la méthode.

mais je ne peux pas faire ceci: xxx

Comment puis-je avoir une méthode statique à coûts zéro d'une classe désactivée pour les compilations non débogues ?


0 commentaires

3 Réponses :


9
votes

Soyez prudent. Les méthodes Objective-C ne sont pas les mêmes que les fonctions C. Un procédé de l'objectif-c est traduit par le compilateur dans le objc_msgsend () Appel de fonction; Vous n'avez pas de contrôle si une méthode est en ligne ou non parce que cela n'est pas pertinent. Vous pouvez en savoir plus sur l'exécution de l'objectif-C ici (Guide de programmation d'exécution de l'objectif-C) , ici (Référence d'exécution de l'objectif-C) et ici (cocoasamurai post) et une recherche rapide de Google devrait faire apparaître plus d'informations.


2 commentaires

Aussi, méfiez-vous une optimisation prématurée. Un marquage en ligne sur une fonction d'impression n'est pas susceptible d'économiser beaucoup de temps, même si la fonction est appelée beaucoup. L'inlinisation n'ayant généralement aucun sens où le rendement est très facile à calculer, de sorte que la fonction d'appel de fonction est significative. Rien n'impliquant aucune variation de PrintF est facile en termes de nombre d'instructions appelées.


Outre le fait qu'aujourd'hui, la plupart des compilateurs modernes (GCC ou Scrang) savent généralement comment reconnaître les fonctions qui fonctionnent bien en ligne et les marqueront comme elles-mêmes. Les humains sont notoirement mauvais à l'estimation de quelles fonctions fonctionnent bien en ligne, il est donc recommandé de laisser cela seul pour le compilateur à comprendre (j'ai entendu parler de certains compilateurs C qui n'ignorera même pas que vous marquiez des fonctions comme inline ou non, alors soyez méfiant).



7
votes

Il n'y a pas de méthode statique dans l'objectif-c. Il n'y a que des méthodes de classe, qui sont comme des méthodes d'instance, sauf qu'ils appartiennent à une classe. Cela signifie que, comme des méthodes d'instance, un message envoyé à une classe doit passer via les machines d'expédition de message pour déterminer la méthode correcte à appeler, ce qui se fait à l'exécution. Vous pouvez aligner l'appel à la machine de répartition de la méthode, mais le corps de la méthode ne peut toujours pas être inlincé sans un niveau d'optimisation folle qui n'existe pas dans un compilateur de l'objectif-C pour le moment.

En tout cas, il s'agit d'une micro-optimisation. Si le profilage le montre nécessaire (ce qui ne sera jamais jamais), vous pouvez suivre la gymnastique. Sinon, souciez des problèmes de performance réels dans votre application.


1 commentaires

Pour ceux qui (comme moi) provenant d'un arrière-plan Java où les méthodes de classe et les méthodes statiques sont synonymes, notez que dans les méthodes de classe Objective-C est résolue de manière dynamique - fonctionnant sur des objets de classe, c'est pourquoi ils ne sont pas "statiques". en.wikipedia.org/wiki/Method_(Computer_programming)



0
votes