2013-03-13 68 views
8

我在讀Why is there no reallocation functionality in C++ allocators?Is it possible to create an array on the heap at run-time, and then allocate more space whenever needed?,它明確指出動態數組對象不可能重新分配。是否使用分配提示?

然而,在C++標準庫由約祖蒂斯,它指出一個分配器,allocator,具有以下功能:allocate使用以下語法

pointer allocator::allocate(size_type num, allocator<void>::pointer hint = 0) 

其中hint具有所定義的含義的實現中,其可以是用於幫助提高性能。

是否有任何實現利用這個優勢?

回答

1

C++ 11分的狀態,在20.6.9.1分配器構件

4 - [注:在容器中的成員函數,相鄰元件的地址通常是一個很好的選擇,以通過hint參數。 - 注完]
[...]
6 - [...]使用的hint是不確定的,但目的是協助 局部性如果實現這樣的願望。

在內存中分配鄰近或接近現有元素的新元素可以通過改善局部性來幫助提高性能;因爲它們通常被緩存在一起,所以附近的元素將傾向於一起移動到內存層次結構中,並且不會相互驅逐。

+0

啊,所以它是爲了分配對象而不是重新分配一個現有的對象? – 2013-03-13 09:09:50

+0

你不能只傳遞下一個可用的地址。該提示必須是從之前調用「分配」獲得的。 – Potatoswatter 2013-03-13 09:10:11

1

我不確定具體的實現,但請注意分配器不允許在傳遞給deallocate之前返回提示指針值。因此不能用作原始操作來形成reallocate

該標準說明該提示必須已經被之前致電allocate的電話返回。它說:「[提示]的使用未指定,但它旨在幫助地方。」因此,如果您在一個線程上分配並釋放一系列相似大小的塊,則可能會傳遞先前釋放的值以避免微處理器高速緩存之間的高速緩存爭用。否則,當CPU B發現您仍在使用仍在CPU A緩存中的內存地址時(即使該內存中包含根據C++銷燬的對象),它也必須通過總線轉發垃圾數據。最好讓CPU A和B各自重用各自的緩存地址。

2

我在plf::colony C++容器中使用Visual Studio 2010-2013下的std :: allocator的提示(迭代速度提高了約21%),獲得了小標量類型的迭代次數方面的顯着性能優勢,以及更小的加速GCC 5.1。所以可以肯定地說,使用這些編譯器和std :: allocator,它是有所作爲的。但差異將取決於編譯器。我不知道提示忽視與提示觀察分配器的比率。