题
我正在陷入警告,例如:
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 }
解决方案
唯一的“问题”是您正在尝试强迫编译器做一些效率低下的事情。
采用 ìnline
而不是 __inline__
, ,并尊重编译器关于应该或不应该分配的内容的决策。除非您已经对代码进行了介绍,否 和 验证内部的内部实际上会加快代码而不是放慢速度。
从本质上讲,这是警告说的:“您要我做一些愚蠢的事情,以减慢代码。我将忽略它”。
当然,您可以忽略(或沉默)警告,但是最好的解决方案只是不强迫它首先做任何愚蠢的事情。不要使用特定于编译器的 __inline__
, ,并使用 inline
如果您需要它,并信任编译器来决定嵌入式内容。
其他提示
消除 static __inline__
从标题文件中的函数中,并将其替换为 inline
- C ++标准关键字。您不应该对此发出警告。
在用-werror -winline编译了一些旧代码之后,我在这里偶然发现了一个我想要的警告,因为它发现了重大错误,您忘记了您忘记了作业运营商等。
但是,对于特定功能,我绝对需要它始终被内衬,因此我需要一种方法来抑制仅此块代码的警告。
#pragma GCC diagnostic ignored "-Winline"
是明显的选择,但实际上并没有抑制此警告。解决方案是使用属性ewland_inline:
inline bool function() __attribute__((always_inline));
inline bool function() { /*something*/ };
这将摆脱警告,实际上总是强迫围绕
我看不到这个问题!
据我了解,不应该有性能滞后,因为编译器将内联视为常规功能!
看看海湾合作委员会说什么!
- 温线
警告如果不能绑架功能,并且被声明为内联。即使有此选项,编译器也不会警告系统标头中声明的内联功能。编译器使用各种启发式方法来确定是否嵌入功能。例如,编译器考虑了正在内衬的函数的大小以及在当前函数中已经完成的内衬数量。因此,源程序看似微不足道的变化可能会导致-Winline产生的警告出现或消失。