Question

Je peux définir une classe avec une propriété pour accéder à mes Ivars à l'extérieur de la classe.

Je peux aussi utiliser la myInst-> Ivar syntaxe d'accès en mode C-struct.

En C ++, j'aller avec accesseurs, mais objective-c il y a des cas où je veulent un accès direct. Le système de messagerie entraîne un grand coup de performance avec l'accesseur que les questions dans certains contextes, car le message n'inline comme il peut être avec des méthodes C ++.

Par exemple, dans une classe qui a un scalaire appelé Ivar et une propriété définie sur elle. scalaire est une valeur flottante simple:

-(void) doWorkWithMyClass:(MyClass*)myinst
{
   // array and other locals declaration omitted 
   for (int i = 0; i < reallyBigX; i++) {
      result += [myinst scalar] * array[i];
      [myinst computeNextScalar:i];
   }
}

Si le changement i [MYINST scalaire] à myinst-> scalaire, la méthode fonctionnera beaucoup plus rapidement, puisque l'utilisation des appels avec l'accesseur prendrait la majeure partie de la CPU dans cette boucle.

Comme C ++ je comprends l'accès Ivar directe est en général découragé, mais dans ce contexte, lorsque la vitesse est, est-il acceptable? Sinon, est-il une méthode plus préférée qui utilise encore une classe objective-c?

Était-ce utile?

La solution

Beaucoup de choses deviennent acceptables quand il a un impact significatif sur la performance, mais dans l'exemple que vous donnez, il semble y avoir beaucoup de meilleures solutions.

D'abord, pourquoi ne retourne pas [myinst computeNextScalar:i] le nouveau scalaire? Si vous avez fait cela, vous auriez pas besoin de chercher et tout serait beaucoup plus rapide.

ne peut pas le travail soit déplacé dans myinst? Je veux dire, tu ne peux pas créer quelque chose comme:

result = [myinst totalOverArray:array];

Si reallyBigX est vraiment grand, alors vous devriez considérer le Accelerate.framework ici. Il peut améliorer considérablement les performances du type d'opération que vous semblez faire. (Vous devez faire des tests de performance avec le cadre Accelerate. Il peut être beaucoup plus lent pour certaines opérations, mais celui-ci peut être plus rapide.)

Enfin, considérons le modèle de get... Objective-C. Il ressemble à ceci:

int *scalars = calloc(reallyBigX, sizeof(int));
[myinst getScalars:scalars range:NSMakeRange(0, reallyBigX)];
for (int i = 0; i < reallyBigX; i++) {
   result += scalars[i] * array[i];
}
free(scalars);

BTW, ce qui précède est certainement un candidat pour vDSP_dotpr(), bien que vous devriez performance tester. Dans de nombreux cas, la simple boucle est plus rapide qu'un appel équivalent vDSP lorsque la foulée = 1 (puisque vous pouvez utiliser un incrément simple, plutôt que += stride).

Autres conseils

Oui, il est acceptable: le @public, @private, etc. modificateurs d'accès ont été introduits en partie grâce au soutien des projets où l'accès Ivars à l'extérieur de la classe est nécessaire. Vous devriez éviter d'écrire directement à Ivars, cependant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top