#include <memory>
struct foo { };
int main() { std::make_shared<foo>(); }
对于上述代码,g++7
和clang++5
使用-fno-exceptions -Ofast
生成的汇编代码:
如果未传递
-fno-rtti
,则仅包含对operator new
的单个调用。如果传递了
-fno-rtti
,则包含两个独立的operator new
调用。
这可以很容易地在gcc.godbolt.org (clang++5
版本)上进行验证:
为什么会发生这种情况?为什么禁用RTTI会防止make_shared
统一对象和控制块的分配?
std::shared_ptr<foo>(new foo())
会得到3个分配吗?不,只有2个。嗯。 - Yakk - Adam Nevraumont