Pregunta

Me estoy haciendo inling advertencia, tales como:

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

Para librarse de esta he cambiado el makefile la eliminación de la -Winline para deshacerse de este. No consigo ninguna advertencia inline. Pero, no sé qué sabio es que lo haga en relación con el rendimiento. ¿Puede alguien por favor me sugieren al respecto?

añadido algo más de información:

aquí es ª advertencia:

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

y el código correspondiente es:

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

y desde 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         }
¿Fue útil?

Solución

El único "problema" es que usted está tratando de forzar al compilador para hacer algo ineficiente.

Uso ìnline en lugar de __inline__, y respetar las decisiones compiladores sobre lo que debe o no debe ser inline. No trate de forzar, a menos que ya haya perfila el código, nos pareció que es un cuello de botella, y verificó que inlining en realidad acelerar, en lugar de desaceleración, el código.

Esto es esencialmente lo que el aviso que dice: "que me estás pidiendo que haga algo estúpido que había ralentizar el código que voy a ignorarlo".

Y, por supuesto, puede ignorar (o silencio) la advertencia, pero la mejor solución es sólo para no forzarlo a hacer nada estúpido en el primer lugar. No utilice el compilador __inline__-específica, y el uso inline si lo necesita, y confiar en que el compilador para decidir qué línea.

Otros consejos

Quitar static __inline__ de la función en el archivo de cabecera y reemplazarlo con inline - C ++ estándar de palabras clave. No debería recibir un aviso con eso.

Me encontré aquí después de compilar un código de edad con -Werror -Winline - una advertencia de que quiero de forma predeterminada, ya que encuentra errores significativos, en las que se han olvidado los operadores de asignación, etc.

.

Sin embargo, para una función particular i absolutamente sí es necesario que sea siempre inline, y por lo tanto que necesitaba una manera de suprimir una advertencia sólo para este bloque de código.

#pragma GCC diagnostic ignored "-Winline"

fue la elección obvia, pero en realidad no suprime esta advertencia. La solución es el uso always_inline atributo:

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

Esto deshacerse de la advertencia y de hecho siempre forzar inlining

No veo un problema con eso!

No debería haber un retraso de rendimiento, según entiendo, coz, los compilador trata de la línea como una función regular!

Vea lo GCC tiene que decir!

-Winline
Advertir si una función no puede ser inline y fue declarado como en línea. Incluso con esta opción, el compilador no le advertirá sobre las fallas a las funciones en línea declaradas en las cabeceras del sistema. El compilador utiliza una variedad de heurística para determinar si o no a una función inline. Por ejemplo, el compilador tiene en cuenta el tamaño de la función que se está inline y la cantidad de procesos en línea que ya se ha hecho en la función actual. Por lo tanto, los cambios aparentemente insignificantes en el programa de origen pueden hacer que las advertencias producidas por -Winline a aparecer o desaparecer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top