我有一个如下结构的代码:
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停止了内联。
- 我说得对吗
- 有什么解释为什么会发生这种事吗
- 更改后foo3()发生了什么?它是在foo2()内内联还是在test()
不确定是否需要:我正在为arc处理器使用gcc。
在学习了更多关于这个主题的知识,并观看了Chandler Caruth的一些讲座后,我想说编译器几乎不确定地决定在哪里内联代码。尤其是当没有给它任何"内联"提示时,就像我的情况一样。