簡體   English   中英

C ++重新分配性能與Malloc

[英]c++ realloc performance vs malloc

首先,我知道我錯了,但是我不知道我的錯誤是什么。 根據此鏈接 ,關於“重新分配”,它說

即使將存儲塊移動到新位置,該存儲塊的內容也會保留到新舊大小中的較小者。 如果新大小較大,則新分配部分的值不確定。

因此,如果我們要為數據分配新位置時使用“ realloc”,它將把先前的數據復制到新位置。 因此,如果這是真的,我很想知道使用free + malloc而不是realloc更好嗎? 因為我認為在考慮性能時,將先前的數據復制到新位置並不是一個好主意。

誰能幫助我找出我的錯誤在哪里? 提前致謝。

使用realloc對堆的結構有更好的了解,因此將嘗試避免執行復制。

每次執行malloc / copy / free都沒有這種性能增強

重新realloc的理由是它比“第二個malloc,手動復制,免費”要快。 您懷疑,正常的freemalloc會更快,但這是因為它們做的更少。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM