首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抑制内联警告

抑制内联警告
EN

Stack Overflow用户
提问于 2010-05-10 02:03:56
回答 4查看 4.5K关注 0票数 2

我收到了inling警告,例如:

代码语言:javascript
复制
  warning: inlining failed in call to ‘symbol_Arity’: call is unlikely and code size would grow

为了去掉它,我修改了makefile,删除了-Winline来去掉它。我没有收到任何内联警告。但是,我不知道在性能方面做这件事有多明智。有谁能向我推荐一下吗?

添加了更多信息:

以下是警告:

代码语言:javascript
复制
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

代码语言:javascript
复制
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的

代码语言:javascript
复制
 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         }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-10 03:13:35

唯一的“问题”是你试图强迫编译器做一些低效的事情。

使用ìnline而不是__inline__,并尊重编译器关于应该或不应该内联哪些内容的决定。不要试图强迫它,除非你已经分析了代码,发现它是一个瓶颈,并验证了内联实际上会加速而不是减慢代码。

这本质上就是警告所说的:“你在让我做一些愚蠢的事情,这会减慢代码的速度。我要忽略它”。

当然,您可以忽略(或静默)警告,但最好的解决方案是首先不要强迫它做任何愚蠢的事情。不要使用编译器特定的__inline__,如果需要,可以使用inline,并信任编译器来决定内联什么。

票数 6
EN

Stack Overflow用户

发布于 2010-05-10 02:40:14

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

票数 2
EN

Stack Overflow用户

发布于 2015-12-31 04:20:07

在用-Werror -Winline编译了一些旧代码后,我在这里跌跌撞撞--这是我想默认打开的警告,因为它会发现严重的错误,比如你忘记了赋值运算符等。

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

代码语言:javascript
复制
#pragma GCC diagnostic ignored "-Winline"

是显而易见的选择,但它实际上不会抑制这一警告。解决方案是使用attribute always_inline:

代码语言:javascript
复制
inline bool function() __attribute__((always_inline));
inline bool function() { /*something*/ };

这将消除警告,实际上总是强制内联

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2798589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档