我正在收到警告,例如:
warning: inlining failed in call to ‘symbol_Arity’: call is unlikely and code size would grow
为了摆脱这个我改变了makefile删除-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 }
答案 0 :(得分:5)
唯一的“问题”是你试图强迫编译器做一些低效的事情。
使用ìnline
而不是__inline__
,并尊重编制者关于应该或不应该内联的内容的决定。不要试图强制它,除非你已经分析了代码,发现它是一个瓶颈,和验证内联实际上会加速而不是减慢代码。
这基本上就是警告所说的:“你要我做一些让代码变慢的蠢事。我会忽略它。”
当然,你可以忽略(或沉默)警告,但最好的解决办法就是不要强迫它首先做任何愚蠢的事情。不要使用特定于编译器的__inline__
,并在需要时使用inline
,并相信编译器决定内联的内容。
答案 1 :(得分:2)
从头文件中的函数中删除static __inline__
,并将其替换为inline
- C ++标准关键字。你不应该对此发出警告。
答案 2 :(得分:2)
我在使用-Werror -Winline编译一些旧代码后偶然发现了这一点 - 默认情况下我想要的警告,因为它发现了重大错误,你忘记了赋值操作符等。
但是,对于一个特定的函数,我绝对需要它总是内联,因此我需要一种方法来抑制这个代码块的警告。
#pragma GCC diagnostic ignored "-Winline"
是明显的选择,但它实际上并没有压制这个警告。解决方案是使用属性always_inline:
inline bool function() __attribute__((always_inline));
inline bool function() { /*something*/ };
这将消除警告,实际上总是强制内联
答案 3 :(得分:1)
我没有看到这个问题!
应该没有性能滞后,据我所知,因为编译器将内联视为常规函数!
看看GCC有什么话要说!
-Winline
如果函数无法内联并且声明为内联,则发出警告。即使使用此选项,编译器也不会警告系统头中声明的内联函数失败。
编译器使用各种启发式方法来确定是否内联函数。例如,编译器会考虑内联函数的大小以及当前函数中已经完成的内联量。因此,源程序中看似无关紧要的变化可能导致-Winline产生的警告出现或消失。