Frage

Ich erhalte inling Warnung wie:

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

Dies Um loszuwerden änderte ich das Makefile die -Winline Entfernen dieser loszuwerden. Ich erhalte keine inlining Warnung. Aber ich weiß nicht, wie klug ist es in Bezug auf Leistung zu tun. Kann mir jemand bitte vorschlagen darüber?

hinzugefügt einige weitere Informationen:

Hier ist th Warnung:

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

und der entsprechende Code ist:

von 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   }

und von 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         }
War es hilfreich?

Lösung

Das einzige „Problem“ ist, dass man die Compiler zu zwingen, ist versucht, etwas ineffizient zu tun.

Verwenden ìnline statt __inline__ und respektieren Sie die Compiler Entscheidungen darüber, was sollte oder nicht inlined werden sollte. Versuchen Sie nicht, um es zu zwingen, es sei denn, Sie den Code bereits profiliert haben, fand es einen Engpass sein, und Nachweis erbracht, dass inlining tatsächlich beschleunigen würde, anstatt langsam nach unten, den Code.

Das ist im Wesentlichen, was die Warnung sagt: „Sie mich fragen, etwas zu tun dumm, die den Code verlangsamen würde ich werde es ignorieren“.

Und sicher, können Sie (oder Stille) die Warnung ignorieren, aber die beste Lösung ist einfach nicht zu zwingen, etwas dumm in erster Linie zu tun. Verwenden Sie nicht den Compiler-spezifischen __inline__ und Verwendung inline, wenn Sie es brauchen, und vertrauen den Compiler zu entscheiden, was zu inline.

Andere Tipps

Remove static __inline__ aus der Funktion in der Header-Datei und ersetzen Sie es mit inline - das C ++ Standard-Schlüsselwort. Sie sollen nicht eine Warnung mit, dass bekommen.

Ich stolperte hier, nachdem er einigen alten Code mit Werror -Winline Kompilieren - eine Warnung, dass ich standardmäßig will, weil es erhebliche Fehler findet, wo Sie Zuweisungsoperator usw. vergessen haben

.

jedoch für eine bestimmte Funktion ich es unbedingt brauche immer inlined werden, und somit brauchte ich einen Weg, um eine Warnung nur für diesen Codeblock zu unterdrücken.

#pragma GCC diagnostic ignored "-Winline"

war die offensichtliche Wahl, aber es ist tatsächlich unterdrückt diese Warnung nicht. Lösung ist die Verwendung Attribut always_inline:

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

Dies wird loszuwerden, die Warnung erhalten und eigentlich immer zwingen inlining

Ich sehe nicht ein Problem damit!

Es sollte kein Leistungsverzögerung sein, wie ich sie verstehe, Coz, die Compiler behandelt die Inline als normale Funktion!

Sehen Sie, was GCC zu sagen hat!

-Winline
Warnen, wenn eine Funktion nicht inlined werden kann, und es wurde als inline deklariert. Auch bei dieser Option wird der Compiler nicht über Fehler zu Inline-Funktionen in System-Header erklärt warnen. Der Compiler verwendet eine Vielzahl von Heuristiken, ob oder nicht, um zu bestimmen, eine Funktion inline. Zum Beispiel nimmt der Compiler berücksichtigt die Größe der Funktion inlined wird und die Menge an inlining, dass bereits in der aktuellen Funktion geschehen. Daher scheinbar unbedeutende Änderungen im Quellprogramm können die Warnungen verursachen durch -Winline erzeugt erscheinen oder verschwinden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top