函数不再内联。有什么解释吗?

A function stops being inline. Any explanation?

我有如下结构的代码:

void foo1(uint32_t *num_failures)
{
   ...
}

void foo2(uint32_t *num_failures)
{
   ...
}

void foo3(uint32_t *num_failures)
{
   ...
}

void test()
{
   uint32_t num_failures = 0;
   foo1(&num_failures);
   foo2(&num_failures);
   foo3(&num_failures);
}

现在,我所做的是将以下指令添加到 foo1():

void foo1(uint32_t *num_failures)
{
   ...
   (*num_failures)++;
}

突然间,我看到从 foo2() 内部打印的堆栈大小增加了 36 个字节。

我做了一个 objdump 并搜索了 。产生以下结果:

变更前:

...
00004e08 <test>:

变更后:

...
00004e08 <foo2>:
00005588 <test>:

所以我猜函数 foo2 停止了内联。

  1. 我说得对吗?
  2. 任何解释为什么会这样?
  3. 更改后 foo3() 发生了什么?它是在 foo2() 内还是在 test() 内变成内联的?

不确定是否需要:我将 gcc 用于 arc 处理器。

在学习了更多有关该主题的知识并看了 Chandler Caruth 的一些讲座之后,我想说编译器几乎不确定地决定将代码内联到何处。特别是当不给它任何 'inline' 提示时,就像我的情况一样。