相关疑难解决方法(0)

为什么`std :: make_shared`用`-fno-rtti`执行两次单独的分配?

#include <memory>
struct foo { };
int main() { std::make_shared<foo>(); }
Run Code Online (Sandbox Code Playgroud)

由这两个所产生的asssembly g++7clang++5-fno-exceptions -Ofast上面的代码:

  • 包含对单个呼叫operator new,如果-fno-rtti通过.

  • 包含两个单独的呼叫operator new如果-fno-rtti通过.

这可以gcc.godbolt.org (clang++5版本)轻松验证:

以上godbolt链接的屏幕截图与highlighed operator new call

为什么会这样?为什么禁用RTTI会阻止make_shared统一对象控制块分配?

c++ rtti c++11

25
推荐指数
3
解决办法
1393
查看次数

std :: any没有RTTI,它是如何工作的?

如果我想使用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标题本身并没有给我答案.那段代码对我来说几乎是不可读的.

c++ stl rtti c++17

24
推荐指数
2
解决办法
4104
查看次数

标签 统计

c++ ×2

rtti ×2

c++11 ×1

c++17 ×1

stl ×1