C 有提供像是 C 中 realloc 這樣的函式的新版本嗎?

時間 2021-10-21 00:07:51

1樓:

自己實現可以使用從c那繼承過來的realloc,但是c++的new和allocator體系沒有類似的支援,這就導致了vector在擴容時必須申請一塊新的記憶體並複製,標準也是這樣要求的,就算是標準庫的作者想在底層用realloc去針對可平凡複製構造、析構的型別做這樣的優化也不行。

我想c++不提供新的realloc的乙個大因素是不可平凡複製構造、析構的型別。你自己實現vector的話,也不能全部擴容都用realloc,否則當realloc退化到malloc時你沒有時機去呼叫複製建構函式和析構函式。

但如果在 realloc 中加入 new 後再呼叫 copy assignment 的話不是也可以實現複製嗎 「退化到malloc沒有機會呼叫複製構造和析構」 說實話正是我想讓 "C++ 的 realloc" 去實現可以自動地複製構造和析構

這需要知道這塊記憶體上有多少物件,以及是些什麼物件。如果是簡單的p = new T[n]; p = cpp_realloc(p, n, m);似乎是可以的,只要多乙個引數n表示當前有多少個T物件。但由於placement-new的存在,一塊char的記憶體上可能存在不同的物件,還可能存在空洞,就很難傳遞這樣的資訊了。

另外c的realloc高效的一大原因是當大小超過page size的時候底層可以是用mremap實現的(mremap: This can be used to implement a very efficient realloc.),即使無法在原位址(virtual address space)後面擴充套件,也不一定需要複製全部資料,而是把一整個頁重對映到另乙個頁,在這種情況下依然沒有呼叫複製構造和析構的時機。

而如果把mremap的實現排除在外,realloc的效率恐怕要大打折扣。

2樓:斷賦千歌

現在來假設一下,自己封裝出 C++ 的 realloc 需要什麼:

如果增大空間,重新分配一塊更大的記憶體,將原來的物件弄到新記憶體上,然後釋放記憶體

如果縮小空間,需要釋放在範圍外的物件

(不想寫了,直接說重點)

你為什麼不用 vector ?

3樓:心宇

realloc並不是擴充套件記憶體,而是重新申請了乙個更大的記憶體並把之前的記憶體資料複製進來然後free掉之前的記憶體,並把新的位址返回。

知道了這個原理你可以自己用new 封裝乙個。

請問C 的圖形庫都是基於Windows提供的GDI函式實現的嗎?

lhelpme gdi只能畫畫winform ui 更底層可以依賴 dx 或者opengl 做UI渲染vector 圖計算可以另外搞庫 例如chrome 的skia 粉蒸排骨 請問C 的圖形庫都是基於Windows提供的GDI函式實現的嗎?Linux 情何以堪?OpenGL 情何以堪?X Windo...

C 中引用有什麼用?

海賊王panther 一般是為了函式傳參方便,例如在交換兩個數的函式中 1 沒有使用引用 void fun int a,int b int x 1,y 2 fun x,y 2 使用引用 此處 為引用 void fun int a,int b 函式呼叫 int x 1,y 2 fun x,y 這樣就使...

C 中為什麼有delete 這種寫法?

因為物件導向的,所以很麻煩.如果delete既能釋放乙個元素,又能釋放乙個陣列,會造成混淆,還會在申請釋放時做額外的判斷,浪費額外的記憶體.那樣的話不如乾脆不提供new 了.自己建立陣列儲存.CT t 10 for int i 0 i 10 i 陳碩 新的標準和編譯器擴充套件為什麼不能實現這個簡單的...