有關make shared與class specific operator new的問題?

時間 2021-06-02 17:31:52

1樓:mwish

Is it possible to force `std::make_shared` to use a class's new operator?

這個對你有幫助嗎...

2樓:暮無井見鈴

看了原文之後感覺反而不清晰了,似乎是作者認為 make_shared 會採用 T::operator new ,從而導致問題。

我查了下標準(最新草案),好像沒有說 make_shared 如何分配記憶體,只說了 allocate_shared 的, cppreference 上的 ::new 可能對應的是標準中要求的原位構造物件的方式。

從實現來看,實際上 libstdc++ 、 libc++ 和 MSVC STL 都沒有採用類特定的 T::operator new 。

目前( 2020 年 2 月)三家的 make_shared 實現都只支援非陣列版本,都把動態分配的物件和控制塊組合到乙個物件型別裡,然後分配該型別的物件。

libstdc++ 把 make_shared 委託到 allocate_shared (分配器用 std::allocator 的特化),然後最終是用 rebind 到那個組合型別的分配器分配記憶體。

libc++ 直接在 make_shared 裡面使用 std::allocator 的特化分配記憶體。

MSVC STL 直接用 new 表示式建立那個組合型別的物件。 (而組合型別沒有類內的 opeartor new )

三家的 make_shared 實現最終都是用全域性的 ::operator new 分配記憶體。不過我沒查到標準是否要求這點。

( make_shared 和 allocate_shared 由 N2351 加入。原提案裡有說 make_shared 用全域性 ::operator new 分配記憶體,但似乎整合到標準裡的文字沒有顯式說明這點。

)( boost::shared_ptr 的對應函式有一些替換機制,不過應該與此問題關係不大)

總的來說,目前可以說類特定的 T::operator new 和 make_shared 無關。

假如作者確實認識到這一點的話,可能他的意思是全域性 ::operator new 的策略一般不適合帶有 T::operator new 的類。

這樣一來問題不僅在 make_shared ,其他標準庫容器(除了 array )如果使用預設分配器則存在同樣的問題。

花瓣數量與什麼有關?

偏偏 有種技術好像可以控制花芽分化過程中雄蕊的分化,讓本該分化為雄蕊的物質分化為花瓣,重瓣榆葉梅好像是這麼來的。好像花瓣和雄蕊兩者之間有什麼關係,明天起床翻書後再補。 唔表觀上的花瓣數量與類群的關係其它答案都說得很詳細了,我還是照例來講一下分子機理吧。知乎上沒有搞植物分子的人麼我是搞進化的啊反而次次...

Ethernet 與 EtherCAT 有關係嗎?是什麼關係?

熊小D 爪機黨答題 ethercat協議是基於乙太網幀的。ip協議是在ip資料報外新增了乙太網幀頭,幀頭中包含了ip的協議型別碼 兩位元組,好像是0x0800 ethercat協議是在ethercat資料報外新增乙太網幀頭,協議型別碼為0x88a4。應用層部分ethercat使用了canopen的物...

幸福與物質有關嗎?

明月半清風 有關係。可以把物質理解為金錢嗎?設想某個早晨,路人乙一邊飢腸轆轆的尋找賺錢的機會或工作,一邊還要考慮怎樣盡快為嗷嗷待哺的孩子找到一瓶奶粉 一件好看的衣服。這個時候,小聲哼著歌,腳步輕盈的路人甲出現了,美美的早餐之後的路人甲不慌不忙的走在上班的路上。這個場景之下,路人甲 路人乙哪個會覺得自...