2014-12-10 62 views
1

最近,在C中,我一直在學習動態內存位置。爲什麼不分配一大堆內存?

我還了解了limits.h標準庫。

當分配內存時,爲什麼不這樣做:char array[INT_MAX]而不是試圖使內存都完美和完美的你正在使用它?

我知道有可能在計算機上沒有足夠的可用內存,但在動態分配內存時也可能發生這種情況。

請在您的答案中包含關於效率的評論。

下面是一個例子的代碼:

#include <stdio.h> 
#include <limits.h> 
#include <string.h> 

int main(void) { 
    FILE *fp; 
    char buff[255]; 

    char str[INT_MAX]; 

    fp = fopen("input.txt", "r"); 
    if(fp) { 
     while(fgets(255, buff, fp)) { 
      strcat(str, buff); 
     } 
    } 
    printf("%s\n", str); 
    return 0; 
} 

這是讀取文件,並把它的所有例子中的內容爲一個字符串。

注意:此代碼未編譯,因此如果有任何錯誤,請忽略它們 - 我已經解釋了代碼應該執行的操作。

+2

如果你想自己追蹤所有的內存使用情況,盡一切辦法讓自己失望。 – 2014-12-10 22:38:41

+1

'char array [INT_MAX]'將在棧上分配一個數組。堆棧通常只有幾兆字節。 INT_MAX通常約爲20億。試圖在堆棧上分配2 GB是獲取[堆棧溢出](http://stackoverflow.com)的好方法。此外,手動內存管理是一個令人頭痛的問題,通常是浪費時間。另外,大多數系統在任何給定的秒鐘都有數百個進程運行,所以如果他們都試圖分配幾GB的內存「而不是試圖使內存全部整齊和完美」,那麼內存就會很快耗盡。你可以用一個例子來澄清你的問題嗎? – Cornstalks 2014-12-10 22:39:00

+0

@KerrekSB,我認爲OP建議爲字符串分配最大字符數的緩衝區,而不是試圖找出合適的最大大小是多少。我不認爲他正在考慮寫自己的堆。 – 2014-12-10 22:40:57

回答

2

因爲它與使用重型卡車移動單個小盒子一樣高效...如果您想發送一個盒子或將其從您的家中移出,幾乎所有的時間都要求其他人這樣做。當你餓的時候,我確信你從來不會要求餐廳提供的所有食物。

好吧,你可以分配儘可能多的內存,你可以在一個分配,但現在:你將如何管理這個龐大的塊?你肯定會有這樣的需求,比如使用這個部分作爲一個整數,這個存儲一個給定的結構等。這將導致你自己實現某種內存管理。我相信你不會這麼做。

你還必須考慮資源共享,如果你消耗所有可能的但超過你需要的東西,其他人將會處於飢餓狀態。

您將一個非常非常大的文件的整個內容放到內存中的場景幾乎是不現實的,幾乎不需要這樣的事情。無論如何,如果你真的需要這個,你可能會使用一個內存映射文件,而不是這種「讀取存儲」算法。

0

爲每個字符串分配最大緩衝區大小的建議讓我想起了一個晚宴,主持人不知道每個客人要喝多少酒,因此每個人都要訂購一個酒桶。餐廳裏裝滿了桶,沒有其他任何空間,包括客人。

內存是必須管理的資源,以便您不會用完。或者即使你沒有用完,分配更多的內存也會導致系統減速,因爲將內存交換到磁盤以允許其他應用程序運行。

0

您是否在討論如何分配一個大型陣列並根據需要進行雕刻?或者分配多個INT_MAX元素的數組?

你試圖避免的主要事情是內部碎片。假設你想存儲100個字符串,其中最長的將是50個字符。你當然可以只聲明數組一樣

char strings[100][51]; // +1 for 0 terminator 

,並用它做,但假設你只有1個字符串,它實際上是50個字符長,剩下的5個字符長。你最終浪費了你分配空間的80%。這是否是一個問題取決於你在做什麼,但如果沒有其他,它是不雅觀的。

相關問題