我有这样的方法:
bool MyFunction(int& i)
{
switch(m_step)
{
case 1:
if (AComplexCondition)
{
i = m_i;
return true;
}
case 2:
// some code
case 3:
// some code
}
}
由于 case 语句很多(超过 3 个)并且函数越来越大,我尝试将 case 1 中的代码提取出来并放入一个内联函数中,如下所示:
inline bool funct(int& i)
{
if (AComplexCondition)
{
i = m_i;
return true;
}
return false;
}
bool MyFunction(int& i)
{
switch(m_step)
{
case 1:
if (funct(i))
{
return true;
}
case 2:
// some code
case 3:
// some code
}
}
这段代码似乎比原来的要慢得多。 我用 -Winline 检查过,函数是内联的。为什么这段代码比较慢?我认为这将是等效的。我看到的唯一区别是第二个版本中多了一个条件检查,但我认为编译器应该能够优化它。对吧?
编辑: 有些人建议我应该使用 gdb 来停止两个版本中的每个汇编指令以查看差异。我这样做了。
第一个版本是这样的:
mov
callq (Call to AComplexCondition())
test
je (doesn't jump)
mov (i = m_i)
movl (m_step = 1)
第二个版本,有点慢,看起来更简单。
movl (m_step = 1)
callq (Call to AComplexCondition())
test
je (doesn't jump)
mov (i = m_i)
xchg %ax,%ax (This is a nop I think)
这两个版本做的好像是一样的,所以我还是不知道为什么第二个版本还是比较慢。
最佳答案
只需逐步完成即可。下个断点,进入反汇编 View ,开始单步执行。
所有的谜团都会消失。
关于c++ - 为什么即使函数是内联的,这段代码也会变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2187581/