2013-02-21 125 views
6

是否有可能在標準 C++ 11沒有崩潰的系統(x86,x64,PowerPC/Windows,Linux或MacOS)上獲取剩餘的可用內存?獲取標準C++ 11中剩餘的可用內存?

一個天真的方法是嘗試通過分配過大的尺寸開始非常大的陣列中,捕獲異常,每次它失敗,直到沒有異常被拋出減小尺寸。但是,也許還有一個更有效的/聰明的方法...

編輯1:其實我並不需要的內存的確切數額。我想知道大約(100MB的錯誤欄)我的代碼在啓動時可以使用多少。

編輯2: 你覺得這個代碼是什麼?在我的程序開始時運行它是否安全,否則可能會損壞內存?

#include <iostream> 
#include <array> 
#include <list> 
#include <initializer_list> 
#include <stdexcept> 

int main(int argc, char* argv[]) 
{ 
    static const long long int megabyte = 1024*1024; 
    std::array<char, megabyte> content({{'a'}}); 
    std::list<decltype(content)> list1; 
    std::list<decltype(content)> list2; 
    const long long int n1 = list1.max_size(); 
    const long long int n2 = list2.max_size(); 
    long long int i1 = 0; 
    long long int i2 = 0; 
    long long int result = 0; 
    for (i1 = 0; i1 < n1; ++i1) { 
     try { 
      list1.push_back(content); 
     } 
     catch (const std::exception&) { 
      break; 
     } 
    } 
    for (i2 = 0; i2 < n2; ++i2) { 
     try { 
      list2.push_back(content); 
     } 
     catch (const std::exception&) { 
      break; 
     } 
    } 
    list1.clear(); 
    list2.clear(); 
    result = (i1+i2)*sizeof(content); 
    std::cout<<"Memory available for program execution = "<<result/megabyte<<" MB"<<std::endl; 
    return 0; 
} 
+0

對不起,這次「可能」的兩個可能結果中的「否」已經出來。 – 2013-02-21 17:11:34

+0

這是高度依賴於平臺,並沒有在標準中處理。 – 2013-02-21 17:12:06

+0

沒有「標準」的方式來做到這一點。即使您描述的方法可能不會返回有效的結果。您必須使用特定於平臺的功能。 – 2013-02-21 17:12:38

回答

8

這高度依賴於OS /平臺。你建議的方法甚至不需要在現實生活中工作。在某些平臺上的操作系統將授予您所有的內存請求,但沒有真正給你的記憶,直到你使用它,在這一點上,你得到一個段錯誤...

的標準並沒有任何有關對此。

+0

Segfault不會是一個可能的結果。在Mac OS X上,該進程將被暫停。無論如何,機器通常會首先開始「顛簸」。 – Potatoswatter 2013-02-21 17:19:14

+0

@Patatoswatter:嘗試一個linux的盒子,刪除交換文件,分配一個足夠大的動態數組,並通過它觸及每一個,比如說第4096個字節來觸摸所有的內存頁面。至少在過去它最終會死於SEGFAULT – 2013-02-21 17:24:26

+0

@DavidRodríguez-dribeas - 這就是Linux,OSX是不同的。就像你說的那樣,它「高度依賴」。關鍵在於,在某些系統上,即使在虛擬內存中,也可以成功分配比內存更多的內存,其中「成功」意味着不會拋出新的或來自malloc的非空指針。在「成功」分配內存的虛假數量之後,問題可能不會顯示出來。 – 2013-02-21 17:30:30

2

在我看來,答案是沒有,你不能做到這一點在標準C++。

你可以做什麼,而不是被How to get available memory C++/g++?下討論和內容鏈接在那裏。這些都是平臺特定的東西。這不是標準的,但至少它可以幫助你解決你正在處理的問題。

1

正如其他人所說,這個問題很難精確定義,更不用說解決問題。硬盤上的虛擬內存是否被視爲「可用」?如果系統執行提示刪除文件以獲取更多硬盤空間,同時暫停您的程序呢? (這正是OS X上發生的情況。)

系統可能會實現內存層次結構,因爲您使用的內存層次結構越來越慢。您可以嘗試通過分配和同時使用C alarm中斷設施或clocklocaltime/mktime,或C++ 11的時鐘初始化設備的內存塊檢測RAM和硬盤之間的性能懸崖。由於從效率較低的資源獲取內存的壓力下,隨着機器的減速,掛鐘時間應該會越來越快。 (但是這會假設它沒有被別的過程強調)。你會想告訴用戶程序正在嘗試什麼,並將結果保存到可編輯的配置文件中。

1

我會建議使用可配置的最大數量的內存來代替。由於某些平臺會過度使用內存,因此要分辨您實際訪問的內存量並不容易。假設您可以獨佔100%的可用內存也是不禮貌的,許多系統將運行其他程序。