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

标签 c++ c gcc stack 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 停止了内联。

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

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

最佳答案

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

关于c++ - 函数不再内联。有什么解释吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36307443/

相关文章:

c - 文件系统在程序运行期间转换为只读

c++ - 我如何在 Mac OS X 上使用 GCC 链接英特尔 TBB?

C++动态数组初始化崩溃

c++ - 使用 C++ 对象作为参数从 QML/JS 调用 C++ 函数

c++ - 如何使用 cv::setMouseCallback

无法在 GCC crunchbang 中编译 x86

c - fatal error : sndfile. h.in:没有这样的文件或目录

c++ - 如何声明可变数量的模板参数?

c - 在 MacOS El Captain 上使用 gcc 编译时未找到库

c - gdb 耗时太长,Ctrl-C 无效