#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實際上可以生成更好的代碼。 –