我想製作一個程序,讓我們說代表一個矩陣 現在矩陣將由一個向量表示,向量中的每個對象將以 表示一個單元示例:現在向量 當構造矩陣時,構造函數接收要插入矩陣中的單元列表。 編譯時的列表大小未知編譯時間在C++中創建不使用「新」的對象
我有興趣創建此矩陣,而不使用堆上的內存。換句話說,如果我不知道要將多少個對象插入到向量中,那麼是否有任何方法可以使用「new」或「delete」來創建對象?
我想製作一個程序,讓我們說代表一個矩陣 現在矩陣將由一個向量表示,向量中的每個對象將以 表示一個單元示例:現在向量 當構造矩陣時,構造函數接收要插入矩陣中的單元列表。 編譯時的列表大小未知編譯時間在C++中創建不使用「新」的對象
我有興趣創建此矩陣,而不使用堆上的內存。換句話說,如果我不知道要將多少個對象插入到向量中,那麼是否有任何方法可以使用「new」或「delete」來創建對象?
如果不使用匯編指令對程序/函數的堆棧幀進行直接(因此依賴於平臺)操作,沒有標準的方法來做到這一點 - 我會衷心勸阻。什麼阻止你使用堆?
使用alloca
獲得一個指針,然後使用就地new
操作:
void *p = alloca(sizeof(Class));
new (p) Whatever(arguments);
然而,做使用前閱讀alloca
手冊! 非常小心。正如Jim Brissom所說,alloca
不便攜。
您不需要delete
。當函數返回時內存將被釋放
alloca並非完全可移植... – 2010-09-16 23:23:59
將這種資源管理包起來。手工做內存管理==不好。 – GManNickG 2010-09-16 23:24:11
拋開可移植性的擔憂,是由'alloca'返回的指針保證爲'Whatever'正確對齊? – 2010-09-16 23:25:11
那麼,如果你不想在堆上使用內存,你想從哪裏獲得?
a)系統相關 - 您可以要求操作系統爲您分配一些內存。但這是糟糕的風格(依賴於系統),並且會使用相同的RAM ......只是以不同的方式分配。例如,如果您真的對此感興趣,Windows 32中的:: GlobalAlloc或:: LocalAlloc將執行此類操作。
b)內存映射文件 - 如果您問,因爲您認爲內存不足並且訪問時間不成問題,這可能很有趣。
c)使用像malloc/free這樣的C函數並投射指針......從堆中獲取內存,避免使用「新」和「刪除」關鍵字。
但是,很難說沒有信息的「好」解決方案爲什麼要避免新增/刪除。 你需要動態內存分配,這兩個是做這些的工具。
您能否解釋/改述您的問題,以便您可以得到更準確的答案?
有一種特殊的方式可以使用new來分配堆棧中的內存或作爲靜態存儲使用所謂的放置新運算符。有了這個新版本,你可以保留一大塊內存,並且你明確地告訴你新的存儲特定變量的位置。它的工作如下:
#include <new>
int main()
{
char buffer[500]; // chunk of memory
int p*;
p = new (buffer) int[10];
}
請注意,您需要在爲了使用這個特殊的新運營商新頭。在這種情況下,當您使用自動存儲時,內存將在離開聲明的塊(主)後釋放。
參考文獻:C++ Primer plus。第9章。Page 420
_你爲什麼反對在堆上分配這個對象?這就是堆(至少,主要的東西之一)。 – 2010-09-16 23:20:06
爲什麼你認爲避免堆是個好主意?如果矩陣非常大且不稀疏,從而無法適應堆棧呢? – 2010-09-16 23:21:34
除非你有避免使用'new'的非常具體的原因,這聽起來像是一個想法。 – 2010-09-16 23:25:20