2

次のような inling 警告が表示されます。

  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   }

そして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         }
4

4 に答える 4

6

唯一の「問題」は、コンパイラに非効率的なことを強制しようとしていることです。

ìnlineではなくを使用__inline__し、インライン化すべきものとすべきでないものに関するコンパイラの決定を尊重します。コードをプロファイリングし、それがボトルネックであることが判明し、インライン化によってコードが遅くなるのではなく、実際に速度が上がること確認していない限り、強制しようとしないでください。

それは本質的に警告が言っていることです:「あなたは私にコードを遅くする愚かなことをするように頼んでいます。私はそれを無視します」.

確かに、警告を無視する (または黙らせる) ことはできますが、最善の解決策は、そもそも愚かなことを強制しないことです。コンパイラ固有の を使用せず、必要に応じて使用し、コンパイラを信頼して何をインライン化するかを決定します__inline__inline

于 2010-05-09T19:13:35.427 に答える
2

-Werror -Winline を使用して古いコードをコンパイルした後、ここでつまずきました。これは、代入演算子などを忘れた重大なエラーが見つかったため、デフォルトでオンにしたい警告です。

ただし、特定の関数については、常にインライン化する必要があるため、このコード ブロックだけの警告を抑制する方法が必要でした。

#pragma GCC diagnostic ignored "-Winline"

当然の選択でしたが、実際にはこの警告を抑制しません。解決策は、属性 always_inline を使用することです。

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

これにより、警告が取り除かれ、実際には常にインライン化が強制されます

于 2015-12-30T20:20:07.327 に答える
2

ヘッダー ファイルの関数から削除し、C++ 標準キーワード - にstatic __inline__置き換えます。inlineそれで警告を受けるべきではありません。

于 2010-05-09T18:40:13.637 に答える
1

問題はありません。

私が理解しているように、パフォーマンスの遅れがあるべきではありません.coz、コンパイラはインラインを通常の関数として扱います!

GCC のコメントをご覧ください。

-Winline
関数がインライン化できず、インラインとして宣言されている場合に警告します。このオプションを使用しても、コンパイラは、システム ヘッダーで宣言された関数のインライン化の失敗について警告しません。コンパイラは、さまざまなヒューリスティックを使用して、関数をインライン化するかどうかを決定します。たとえば、コンパイラは、インライン化される関数のサイズと、現在の関数で既に実行されたインライン化の量を考慮します。したがって、ソース プログラムの一見些細な変更によって、-Winline によって生成される警告が表示または非表示になる可能性があります。

于 2010-05-09T18:13:22.667 に答える