[英]c++ realloc performance vs malloc
首先,我知道我錯了,但是我不知道我的錯誤是什么。 根據此鏈接 ,關於“重新分配”,它說
即使將存儲塊移動到新位置,該存儲塊的內容也會保留到新舊大小中的較小者。 如果新大小較大,則新分配部分的值不確定。
因此,如果我們要為數據分配新位置時使用“ realloc”,它將把先前的數據復制到新位置。 因此,如果這是真的,我很想知道使用free
+ malloc
而不是realloc更好嗎? 因為我認為在考慮性能時,將先前的數據復制到新位置並不是一個好主意。
誰能幫助我找出我的錯誤在哪里? 提前致謝。
使用realloc
對堆的結構有更好的了解,因此將嘗試避免執行復制。
每次執行malloc / copy / free都沒有這種性能增強
重新realloc
的理由是它比“第二個malloc,手動復制,免費”要快。 您懷疑,正常的free
和malloc
會更快,但這是因為它們做的更少。
PS。 在C ++中realloc
是非常危險的,因為它沒有調用拷貝構造函數。 OTOH, std::vector::resize
確實會調用復制構造函數,默認構造函數和/或析構函數。
要注意的一件事是,多個malloc將比多個realloc更快。
例如,假設您想通過每次加倍來增加內存。 您可以重新分配很大的內存。 另一種方法是進行多個malloc調用以創建一個內存塊向量。
請看以下示例:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
static const size_t INITIAL_MEMORY_SIZE = 2;
static const size_t NUM_ALLOCATIONS = 32;
static const size_t NUM_ITERATIONS = 100;
static void multiple_malloc() {
size_t previous_size = 0;
size_t current_size = INITIAL_MEMORY_SIZE;
char* data[NUM_ALLOCATIONS];
for (size_t i = 0; i < NUM_ALLOCATIONS; i++) {
data[i] = malloc(sizeof(char) * current_size);
assert(data[i]);
current_size += previous_size;
previous_size = current_size;
}
for (size_t i = 0; i < NUM_ALLOCATIONS; i++) {
free(data[i]);
}
}
static void multiple_realloc() {
size_t current_size = INITIAL_MEMORY_SIZE;
char* mem = 0;
for (size_t i = 0; i < NUM_ALLOCATIONS; i++) {
mem = (char*)realloc(mem, sizeof(char) * current_size);
assert(mem);
current_size += current_size;
}
free(mem);
}
static void run_test(
const char* test_name,
void allocate()) {
clock_t start = clock();
for (size_t i = 0; i < NUM_ITERATIONS; i++) {
allocate();
}
clock_t end = clock();
printf("%s: ran in %lf seconds.\n",
test_name, (end - start) / (double)CLOCKS_PER_SEC);
}
int main(int argc, char** argv) {
run_test("multiple_malloc", multiple_malloc);
run_test("multiple_realloc", multiple_realloc);
return 0;
}
多個malloc將比多個realloc快得多:
$ ./misc_perf_test
multiple_malloc: ran in 0.171875 seconds.
multiple_realloc: ran in 7.859375 seconds.
當創建數據結構(例如地圖或列表)時,您可能希望預分配大量元素,因此malloc會更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.