使用-O标志和分别打开成分优化之间有什么区别?

时间:2019-02-25 18:06:56

标签: c++ g++

我有一个程序,当未设置-O标志时,该程序可以编译并正常运行。

当我尝试使用-Og进行构建时,程序抱怨纯虚拟函数被调用并崩溃。

我试图对此进行跟踪,所以我使用了命令

g++ -Og  -Q --help=optimizers

以获取-Og已启用的优化列表。这给了我应该启用的83种不同优化标志的列表。 (奇怪的是,如果我提供-O0而不是-Og,我仍然可以获得58种优化。)

我尝试使用此优化列表而不是直接使用-Og进行构建,以为我将使用二进制搜索来查找有问题的优化。令我惊讶的是,该程序正常运行了!

问题:获取已启用的优化列表时,我在做错什么吗?还是-Og标志还有其他作用?


奖励详情

不幸的是,我无法将正在编译的程序剥离为一个最小的工作示例。无论这看起来多么微妙,例如,如果我在构造函数内部添加cout,问题就会消失。但是,要给出这里发生的情况的基本草图:

  • 有一个带有纯虚方法的基类。
  • 基类构造函数调用std::bind(&Base::virtual_method, this)并将其作为对另一个对象的回调。
  • 派生类实现虚拟方法。
  • 派生类的构造函数具有一些成员初始化程序,但构造函数主体中没有代码。
  • 如果我将无法优化的代码放入构造函数主体中,例如cout,然后一切都会按预期进行。

因此,我猜测出于某些原因,正在优化派生类构造函数中填充vtable指针的部分。 (我还没有手动检查生成的程序集,因为还没有弄清楚该怎么做。)

0 个答案:

没有答案