2010-05-09 33 views
1

我越来越inling警告如:Supressing内联警告

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

为了摆脱这个我改变了生成文件去除-Winline摆脱这一点。我没有得到任何内联警告。但是,我不知道它在表演方面有多聪明。任何人都可以给我建议吗?

增加了一些详细信息:

这里是个警告:

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 

和相应的代码是:

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

和搜索。 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   } 
+1

为什么你使用'内联__inline__'而不是标准的C++关键字'inline'? – 2010-05-09 18:35:55

+0

我很抱歉,我误标了它。这个代码实际上是用C语言编写的,但它已经从C90转换为C99。我认为即使对于C99,关键字也不相同。我改变了关键词。即使我和以前一样。 – thetna 2010-05-09 19:26:02

回答

5

唯一的“问题”是,你试图迫使编译器做一些效率低下。

使用ìnline而不是,并且尊重编译器关于应该或不应该内联的决定。不要试图强迫它,除非你已经成型的代码,发现这是一个瓶颈,证实,内联实际上会加快,而不是放缓,代码。

这是本质是什么警告说:“你问我做一些愚蠢,会减慢代码我会忽略它。”

而且,当然,你可以忽略(或沉默)的警告,但最好的解决方法就是不要强迫它做任何事情摆在首位愚蠢。如果您需要,请不要使用特定于编译器的,并使用inline,并相信编译器决定内联什么。

+0

我试着用 __inline__ 替换为 inline ,即使这样我也得到了同样的警告。它可以有任何替代品吗? – thetna 2010-05-09 21:50:07

1

我看不出有什么问题!

不应该有一个性能滞后,据我了解,表兄弟姐妹,编译器将内联作为一个经常性的功能!

看到什么GCC不得不说!

-Winline
如果函数不能内联并且声明为内联,则发出警告。即使使用此选项,编译器也不会警告有关内联在系统头文件中声明的函数的失败。 编译器使用各种启发式来确定是否内联一个函数。例如,编译器考虑了内联函数的大小以及当前函数中已经完成的内联量。因此,源程序中看似微不足道的变化可能会导致由-Winline产生的警告出现或消失。

2

从头文件中的函数中删除static __inline__并将其替换为inline - C++标准关键字。你不应该得到一个警告。

2

我编译了一些旧的代码后,偶然发现了-Werror -Winline - 一个警告,我想默认,因为它发现了重大的错误,你忘记了赋值操作等。

但是,对于一个特定的函数,我绝对需要它总是内联,因此我需要一种方法来抑制这个代码块的警告。

#pragma GCC diagnostic ignored "-Winline" 

是显而易见的选择,但它实际上并没有禁止这种警告。解决方案是使用属性always_inline:

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

这将摆脱的警告,实际上总是强迫