我有一个程序,当未设置-O
标志时,该程序可以编译并正常运行。
当我尝试使用-Og
进行构建时,程序抱怨纯虚拟函数被调用并崩溃。
我试图对此进行跟踪,所以我使用了命令
g++ -Og -Q --help=optimizers
以获取-Og
已启用的优化列表。这给了我应该启用的83种不同优化标志的列表。 (奇怪的是,如果我提供-O0
而不是-Og
,我仍然可以获得58种优化。)
我尝试使用此优化列表而不是直接使用-Og
进行构建,以为我将使用二进制搜索来查找有问题的优化。令我惊讶的是,该程序正常运行了!
问题:获取已启用的优化列表时,我在做错什么吗?还是-Og
标志还有其他作用?
奖励详情
不幸的是,我无法将正在编译的程序剥离为一个最小的工作示例。无论这看起来多么微妙,例如,如果我在构造函数内部添加cout
,问题就会消失。但是,要给出这里发生的情况的基本草图:
std::bind(&Base::virtual_method, this)
并将其作为对另一个对象的回调。cout
,然后一切都会按预期进行。因此,我猜测出于某些原因,正在优化派生类构造函数中填充vtable指针的部分。 (我还没有手动检查生成的程序集,因为还没有弄清楚该怎么做。)