函数停止内联.任何解释



我有一个如下结构的代码:

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()

不确定是否需要:我正在为arc处理器使用gcc。

在学习了更多关于这个主题的知识,并观看了Chandler Caruth的一些讲座后,我想说编译器几乎不确定地决定在哪里内联代码。尤其是当没有给它任何"内联"提示时,就像我的情况一样。

最新更新