2010-05-09 83 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*/ }; 

這將擺脫的警告,實際上總是強迫