#include <memory>
struct foo { };
int main() { std::make_shared<foo>(); }
双方g++7
和clang++5
与-fno-exceptions -Ofast
对于上面的代码所产生的asssembly:为什么`std :: make_shared`用`-fno-rtti`执行两个单独的分配?
包含对
operator new
单个呼叫如果是-fno-rtti
不传递。包含两个单独的呼叫到
operator new
如果-fno-rtti
是通过。
这可以很容易地验证on gcc.godbolt.org(clang++5
version):
这究竟是为什么?为什么禁用RTTI阻止make_shared
统一对象和控制块分配?
相关:http://stackoverflow.com/questions/38180899/shared-ptr-without-rtti – YSC
由于您已禁用虚拟功能库不能使用打包结构(元素,refcount和deleter) ,因为这需要删除类型。所以库需要分别分配元素+引用计数和删除器。 –
这也是一个很好的例子,有些开发人员坚持认为“没有rtti +没有例外会产生最快的C++代码”。这里举一个例子证明rtti实际上可以生成更好的代码。 –