2009-10-23 6 views
1

J'ai une méthode comme celle montrée ci-dessous. La boucle for fera-t-elle toujours passer le compilateur à "la requête en ligne"?Est-il acceptable d'avoir une méthode déclarée comme méthode en ligne si elle a une boucle for en C++?

inline void getImsiGsmMapFrmImsi 
    (
    const string& imsiForUEDir, 
    struct ImsiGsmMap& imsiGsmMap 
) 
{ 
    for (int i = 0 ; (unsigned)i < imsiForUEDir.length() - 1 ; i++) 
    { 
     imsiGsmMap.value[i] = imsiForUEDir[i] - '0' ; 
    } 
    imsiGsmMap.length = imsiForUEDir.length() - 1 ; 
} 
+0

Wow. Désolé, AraK et Steven. L'équipe SO _really_ doit gérer le problème des modifications multiples. –

+5

Celui qui doit lire ce code a mes plus sincères condoléances. –

+1

Si c'est du C++, pourquoi mettre un 'struct' devant les noms de structure? En C++, ce sont des citoyens de première classe, pas de simples étiquettes. Si ce 'i' doit être' unsigned' (et que les indixes de tableau le font), pourquoi le faites-vous signer? Êtes-vous sûr de ne pas vouloir accéder au dernier élément de 'imsiForUEDir'? (Pour quelqu'un qui a le contexte, il peut être clair que ce n'est pas une erreur au hasard, mais intentionnel, mais d'après ce que je vois, il semble suspect.) – sbi

Répondre

3

Simplement, non.

"inline" est juste un indice pour le compilateur.

Il existe des moyens pour forcer un compilateur à inline quelque chose, mais ces moyens sont spécifiques au compilateur. Votre code semble mobile pour moi, alors voici quelques façons sur certains compilateurs C++ utilisés sur différentes plates-formes de téléphonie mobile:

compilateur Windows CE/Windows Mobile VC++ ARM utilise le mot-clé __forceinline au lieu de l'indice « en ligne ».

Un meilleur compilateur (c'est-à-dire rendant la sortie plus rapide) pour Windows CE/Windows Mobile est cegcc, qui utilise le tout dernier GCC 4.4. Dans GCC, vous écrivez __attribute__((always_inline))après le nom de la fonction et avant le corps.

La plus grande chose est si c'est une bonne idée d'intégrer cette boucle. Je programme des téléphones mobiles pour vivre, et ils n'ont généralement pas beaucoup de budget CPU. Mais je serais vraiment surpris si cette boucle est un goulot d'étranglement. Dénuder votre programme de toutes les décorations «en ligne» et quand vous approchez de l'expédition, si le programme est lent, le profil! Certains compilateurs permettent une 'optimisation guidée par profil' où ils peuvent faire un binaire instrumenté que vous exécutez de manière réaliste, puis ils utilisent les données ainsi rassemblées pour faire un binaire de production où ils prennent des décisions éclairées sur la vitesse du code par rapport au code taille dans les différentes parties de votre programme pour donner le meilleur mélange des deux.

+1

Non? J'interpréterais la réponse comme «oui». Vous pouvez _say_ inline à peu près partout où vous voulez. Le compilateur a le droit de vous ignorer. :-) – asveikau

+1

Il répondait "Non" à "Est-ce que la boucle for fait toujours passer le compilateur à" la requête en ligne "?" –

+0

Notez que même avec '__forceinline' le compilateur peut toujours ignorer la 'requête':" Il n'y a aucune garantie que les fonctions seront inline.Vous ne pouvez pas forcer le compilateur à aligner une fonction particulière, même avec le mot-clé '__forceinline'" (http : //msdn.microsoft.com/en-us/library/z8y1yy88.aspx). J'imagine que la même chose est vraie avec 'always_inline 'de GCC (les docs semblent impliquer que la seule chose que cet attribut fait est que l'inline se produise quand l'optimisation est désactivée). À un certain moment, le compilateur va dire 'non!'. Ce serait une bonne astuce d'intégrer une fonction récursive donnée. –

5

Vous pouvez spécifier "inline" et le compilateur peut l'ignorer si cela vous tente.

0

Je me demande si le mot-clé inline est encore plus nécessaire. Les compilateurs modernes ne l'ignorent-ils pas tout simplement et font-ils ce qu'ils pensent être le mieux, de toute façon?

+2

Il est nécessaire si l'en-tête avec une implémentation de fonction est inclus dans plusieurs unités de traduction. – sharptooth

+0

Certains compilateurs ont des paramètres qui les obligent à traiter 'inline' comme un ordre strict, pas comme un indice. Certains compilateurs proposent des formes alternatives non standards de mots-clés 'inline' qui forcent l'inline. – AnT

+0

Est-il exact si je déclare la méthode comme vide getImsiGsmMapFrmImsi (chaîne const & imsiForUEDir, struct ImsiGsmMap & imsiGsmMap) dans la classe (c.-à-.h fichier), puis définir la méthode comme vide en ligne getImsiGsmMapFrmImsi (chaîne const & imsiForUEDir, struct ImsiGsmMap & imsiGsmMap) { ...} dans le fichier de code qui inclut le fichier de classe (.h)? – abhijeet

2

"Inline pour les fonctions avec des boucles" est probablement un peu de l'heuristique en ligne d'un compilateur particulier. Cela ne s'applique pas universellement. Chaque compilateur utilise des heuristiques pour déterminer si la fonction doit être en ligne ou non, mais normalement chaque compilateur utilise ses propres. Donc, dire qu'une boucle aura un effet universel sur l'inline n'est pas correct. Ça ne va pas. Il n'y a absolument rien dans votre fonction qui empêcherait fondamentalement l'inlining. La plupart des compilateurs modernes peuvent facilement intégrer cette fonction, s'ils la jugent raisonnable ou si vous les forcez à le faire.

Oui, certains compilateurs offrent déclaration non standard spécificateurs (ou options du compilateur) qui fait la force l'inline, à savoir passer outre l'analyse heuristique, à l'exception d'un certain nombre de situations où le inline est vraiment au-delà des capacités du compilateur. Par exemple, de nombreux compilateurs C/C++ modernes ne peuvent normalement pas intégrer des fonctions avec un nombre variable de paramètres (fonctions variadiques).

Il est également communément admis que la fonction récursive ne peut pas être inline. En réalité, dans de nombreux compilateurs, les fonctions récursives peuvent être intégrées à une certaine profondeur de récursion fixe, ce qui permet de "comprimer" la récursion.

0

Les compilateurs les plus susceptibles n'incluront pas une fonction avec une boucle, car quel serait le point? Si le code est en boucle, généralement le coût d'un appel de fonction sera un bruit non mesurable par rapport à la boucle.

Mais si un compilateur veut l'aligner (peut-être que le compilateur est suffisamment sophistiqué pour déterminer les limites de la boucle et peut même dérouler la boucle), il est certainement autorisé à le faire.

Mais je ne parierais pas dessus.

0

Pour résumer un précédent answer j'ai donné à cela, les choses que vous devriez faire attention lors du choix d'une fonction inline sont:

* local static variables 
* loop constructs 
* switch statements 
* try/catch 
* goto 
* recursion 
* and of course too much complexity (whatever that means) 

Ceci étant dit que les autres réponses indiquent ici dehors, il est essentiellement non précisé si le compilateur inline la fonction ou non. 7.1.2/2 a:

Une déclaration de fonction (8.3.5, 9.3, 11.4) avec un spécificateur en ligne déclare une fonction en ligne. Le spécificateur en ligne indique à l'implémentation que la substitution en ligne du corps de la fonction au point d'appel doit être préférée au mécanisme d'appel de fonction habituel. Une implémentation n'est pas nécessaire pour effectuer cette substitution en ligne au point d'appel; cependant, même si cette substitution en ligne est omise, les autres règles pour les fonctions en ligne définies au § 7.1.2 doivent toujours être respectées.

Un détail intéressant à ce sujet, c'est que le compilateur devrait normalement étiqueter le type de comportement qui est impliqué ici. Par exemple: "il est non spécifié" ou "le comportement est indéfini", etc.