在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