2017-05-13 16 views
1

換句話說,每次調用它時,系統調用是否執行malloc()? (可能預先分配一個大塊)C++新操作符在底下使用malloc()嗎?

+3

執行依賴我想象。 –

+1

malloc不是系統調用,它是標準C庫中的一個函數。 –

+0

@ Neil通過了。 –

回答

0

換句話說,每次調用它時,系統調用是否需要執行malloc()

它實際上是實現依賴。但是通常new的實現將使用malloc()系統調用/ c庫綁定。

(也許分配了大量提前塊)

是的,你必須考慮到,作爲一個缺點。頻繁調用像

char* newChar = new char(); 

可分配更大的塊不必要的混亂您的動態存儲空間,多單char需要。

如果您希望覆蓋該行爲以獲得更高效的內存管理,則始終可以使用placement new

0

正如其他人所說,這是實現定義。但是,我認爲高性能的C++實現可能不會使用malloc(),但會使用特定於操作系統的內存分配API或系統調用(malloc()必須使用它)。畢竟,爲什麼要爲每個內存分配添加一個額外的函數調用?但我沒有這方面的確鑿證據。

0

在C++ 14之前,該標準禁止實施合併分配。因此,每個new表達式確實與一個系統分配函數(可能是malloc)的調用一一對應。

C++ 14 relaxed this restriction在某些情況下。如果一個人的生命週期完全在另一個人的生命週期內,那麼現在就有可能將這個分配結合起來。儘管這是一個相當狹窄的限制,所以我預計分配實際上並不經常結合。