2010-08-08 56 views
5

我讀過「Modern C++ Design」中的小對象分配。 Andrei Alexandrescu認爲,通用操作符(new和delete)對分配小對象表現不佳。什麼被認爲是C++中的一個小對象?

在我的程序中有很多在免費商店創建和銷燬的對象。這些對象測量超過8000個字節。

什麼尺寸被認爲很小? C++中的內存分配是8000字節還是小的還是大的?

+0

取決於實現。 – kennytm 2010-08-08 19:29:19

+2

對象是單獨測量8000字節還是累積?雖然@KennyTM表示它依賴於實現,但在每個對象8000字節的情況下,該對象將被視爲較小的實際應用並不多。 – 2010-08-08 19:34:43

+0

@Jared P,每個對象的測量值大於8000字節。我的程序應該在Windows和Linux服務器系統上高度運行。 – 2010-08-08 19:38:29

回答

13

的「小」而變化,但一般來說定義,一個對象可以被認爲是「小」,如果它的尺寸大於由堆分配的大小的額外開銷的情況下(或至少是接近的大小)。

因此,在大多數情況下,16字節的對象可能被認爲是「小」的。在某些特定情況下,32字節的對象可能會被視爲很小。一個8,000字節的對象絕對不是「小」的。

通常,如果您要經歷使用小對象分配器的麻煩,您正在尋求提高某些代碼塊的性能。如果使用小對象分配器不能幫助你的性能,那麼你可能不應該使用它。

1

我當然不會認爲8000字節是'小'。小對象很可能意味着佔用不超過幾百字節的對象 - 數量相當於幾個字節的對象將導致最大的問題 - 但是,由於Kenny指出這是依賴於實現的,並且一些C++運行時可能非常擅長處理小物件。

3

[...]認爲通用運算符(new和delete)對分配小對象的性能不好。

平臺依賴。例如。在Linux上,我曾經使用靜態內存管理和GNU的std :: map(它是紅黑樹和全動態內存管理)對我自己開發的AVL樹進行了基準測試。令我驚訝的是,std :: map有時超出了我自己的高效的實現。而std :: map確實會造成很小的內存分配。

在我的程序中有很多在免費商店創建和銷燬的對象。

內存管理問題是一個有效的。從某種意義上說,如果可能,應始終嘗試重新使用現有資源,或避免創建臨時副本。

這就是如果效率/ CPU性能你以後。如果代碼很少運行,那麼打擾就沒有意義了。

這些對象測量超過8000個字節。什麼尺寸被認爲很小? C++中的內存分配是8000字節還是小的還是大的?

這是毫無意義的問題。如果你的程序需要一個8K的對象,那麼你的程序需要它。期。

只有當您收到抱怨說軟件需要太多RAM或分析器指向內存管理的性能瓶頸時,才應該擔心。否則,現代內存管理是相對快速和強大的。

P.S.我個人會認爲8K是一個平均內存分配大小。不小 - 不是很大。但我已經習慣使用隨機分配10 + GB的程序。如果數據集必須駐留在RAM中並且大小爲10GB,那麼應用程序別無選擇,只能嘗試加載它。

0

問題是,對象有多少,但是,運算符new/delete會調用多少內存開銷?如果你的對象不止這些,那麼它就不是那麼小。

相關問題