函数不再内联。有什么解释吗?
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 停止了内联。
- 我说得对吗?
- 任何解释为什么会这样?
- 更改后 foo3() 发生了什么?它是在 foo2() 内还是在 test() 内变成内联的?
不确定是否需要:我将 gcc 用于 arc 处理器。
在学习了更多有关该主题的知识并看了 Chandler Caruth 的一些讲座之后,我想说编译器几乎不确定地决定将代码内联到何处。特别是当不给它任何 'inline' 提示时,就像我的情况一样。
我有如下结构的代码:
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() 内变成内联的?
不确定是否需要:我将 gcc 用于 arc 处理器。
在学习了更多有关该主题的知识并看了 Chandler Caruth 的一些讲座之后,我想说编译器几乎不确定地决定将代码内联到何处。特别是当不给它任何 'inline' 提示时,就像我的情况一样。