#include <memory>
struct foo { };
int main() { std::make_shared<foo>(); }
Run Code Online (Sandbox Code Playgroud)
由这两个所产生的asssembly g++7和clang++5与-fno-exceptions -Ofast上面的代码:
包含对单个呼叫operator new,如果-fno-rtti是未通过.
包含两个单独的呼叫到operator new如果-fno-rtti被通过.
这可以在gcc.godbolt.org (clang++5版本)上轻松验证:
为什么会这样?为什么禁用RTTI会阻止make_shared统一对象和控制块分配?
如果我想使用std::any我可以使用RTTI关闭.以下示例-fno-rtti使用gcc 编译并按预期运行.
int main()
{
std::any x;
x=9.9;
std::cout << std::any_cast<double>(x) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是如何std::any存储类型信息?正如我所看到的,如果我std::any_cast使用"错误"类型调用,我会得到std::bad_any_cast预期的异常.
这是如何实现的,或者这可能只是一个gcc功能?
我发现boost::any也不需要RTTI,但我发现也没有解决这个问题.boost :: any需要RTTI吗?.
深入研究STL标题本身并没有给我答案.那段代码对我来说几乎是不可读的.