Question

Je reçois inling avertissement tels que:

  warning: inlining failed in call to ‘symbol_Arity’: call is unlikely and code size would grow

Pour se débarrasser de ce que j'ai changé le makefile enlever le -Winline pour se débarrasser de cela. Je ne reçois pas d'avertissement inline. Mais, je ne sais pas comment est-il sage de faire en ce qui concerne la performance. Quelqu'un peut-il s'il vous plaît me suggérer à ce sujet?

Ajout d'informations:

ici est e avertissement:

search.c: In function ‘prfs_InsertInSortTheories’:
list.h:254: warning: inlining failed in call to ‘list_Delete’: call is unlikely and code size would grow
search.c:187: warning: called from here
list.h:254: warning: inlining failed in call to ‘list_Delete’: call is unlikely and code size would grow
search.c:189: warning: called from here

et le code correspondant est le suivant:

de list.h

254 static __inline__ void list_Delete(LIST L)
255 {
256   LIST Current;
257 
258   Current = L;
259   while (!list_Empty(Current)) {
260     L = list_Cdr(L);
261     list_Free(Current);
262     Current = L;
263   }

et de search.c

 176     LIST    approx;
 177     l = clause_Length(Clause);
 178     for (i = clause_FirstSuccedentLitIndex(Clause); i < l; i++) {
 179       lit = clause_GetLiteral(Clause,i);
 180       if (clause_LiteralIsMaximal(lit) &&
 181           symbol_IsBaseSort(term_TopSymbol(clause_LiteralSignedAtom(lit)))) {
 182         if (prfs_DynamicSortTheory(Search) != (SORTTHEORY)NULL
 183             && clause_NumOfSuccLits(Clause) == 1 &&
 184             clause_NumOfAnteLits(Clause) == 0)
 185           {
 186           copy = clause_Copy(Clause);
 187           list_Delete(clause_ParentClauses(copy));
 188           clause_SetParentClauses(copy,list_Nil());
 189           list_Delete(clause_ParentLiterals(copy));
 190           clause_SetParentLiterals(copy,list_Nil());
 191           clause_SetNumber(copy,clause_Number(Clause));
 192           sort_TheoryInsertClause(prfs_DynamicSortTheory(Search),Clause,
 193                                   copy,clause_GetLiteral(copy,i));
 194         }
Était-ce utile?

La solution

Le seul « problème » est que vous essayez de forcer le compilateur à faire quelque chose inefficace.

Utilisez ìnline plutôt que __inline__ et respecter les décisions des compilateurs sur ce qui devrait ou ne devrait pas être inline. Ne pas essayer de forcer, à moins que vous avez déjà PROFILES le code, trouvé qu'il était un goulot d'étranglement, et vérifié que inline accélérerait réellement, plutôt que vers le bas lent, le code.

C'est essentiellement ce que l'avertissement dit: «Vous me demandez de faire quelque chose de stupide qui avait ralentir le code que je vais l'ignorer ».

Et bien sûr, vous pouvez ignorer (ou silence) l'avertissement, mais la meilleure solution est juste de ne pas forcer à quoi que ce soit stupide, en premier lieu. Ne pas utiliser le __inline__ spécifique-compilateur, et l'utilisation inline si vous en avez besoin, et faire confiance au compilateur de décider quoi en ligne.

Autres conseils

Supprimer static __inline__ de la fonction dans le fichier d'en-tête et le remplacer par inline - le mot-clé standard C ++. Vous ne devriez pas recevoir un avertissement avec cela.

Je suis tombé ici après avoir compilé un vieux code avec -Werror -Winline - un avertissement que je veux par défaut parce qu'il trouve des erreurs importantes, où vous avez oublié les opérateurs d'affectation etc

.

Cependant, pour une fonction particulière je ne suis absolument besoin d'être toujours inline, et donc je besoin d'un moyen de supprimer un avertissement pour tout ce bloc de code.

#pragma GCC diagnostic ignored "-Winline"

était le choix évident, mais il ne fait pas disparaître cet avertissement. La solution est d'utiliser l'attribut always_inline:

inline bool function() __attribute__((always_inline));
inline bool function() { /*something*/ };

Cela se débarrasser de l'avertissement et en fait la force toujours inline

Je ne vois pas de problème avec ça!

Il ne devrait pas être un retard de performance, que je comprends, coz, le compilateur traite l'inline en fonction régulière!

Voyez ce que GCC a à dire!

-Winline
Avertir si une fonction ne peut pas être inline et il a été déclaré en ligne. Même avec cette option, le compilateur ne sera pas mettre en garde contre les défaillances de fonctions en ligne déclarés dans les en-têtes du système. Le compilateur utilise une variété de heuristiques pour déterminer si oui ou non une fonction inline. Par exemple, le compilateur prend en compte la taille de la fonction étant inline et la quantité de inline qui a déjà été fait dans la fonction actuelle. Par conséquent, des changements apparemment insignifiants dans le programme source peut provoquer des avertissements produits par -Winline apparaître ou disparaître.

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