在GCC编译器中,无论何时-O3被标记,编译器都主要通过循环展开和函数内联来优化。为什么-O3 GCC Optimization没有内联这个功能?
但是,当我编译具有以下功能的应用程序时,它没有执行函数内联。从gprofing和gconving我可以注意到这个函数(comp_t_delay)没有从这个应用程序的主函数单元调用。但是,它是从函数调用的函数调用的,由main函数调用。
这里是comp_t_delay(int类型,INT IP),我想知道为什么它使用-O3海合会没有优化的代码(任何帮助表示赞赏!):
static float
comp_t_delay(int in,int ip)
{
int sb, sib,dx, dy;
t_type_ptr st, sit;
float d_ssi;
d_ssi = 0.;
sb = net[in].node_block[0];
st = block[sb].type;
sib = net[in].node_block[ip];
sit = block[sib].type;
assert(st != NULL);
assert(sit != NULL);
dx = abs(block[sib].x - block[sb].x);
dy = abs(block[sib].y - block[sb].y);
if(st == T_IO)
{
if(sit == T_IO)
d_ssi = de_io[dx][dy];
else
d_ssi = de_iof[dx][dy];
}
else
{
if(sit == T_IO)
d_ssi = de_fio[dx][dy];
else
d_ssi = de_fb[dx][dy];
}
if(d_ssi < 0)
{
printf
("Error1\n");
exit(1);
}
if(d_ssi < 0.)
{
printf
("Error2\n");
exit(1);
}
return (d_ssi);
}
取决于调用了多少个地方,它可能已经决定代码膨胀超过了内联的好处。 – aaronasterling 2010-09-27 00:02:16
如果你真的希望这个函数内联,这可能是一个坏主意,你可以强制GCC通过在函数定义中加入__attribute __((always_inline))来内联它。 – qdii 2012-09-29 16:46:39