获取标准C ++ 11中剩余的可用内存?

时间:2013-02-21 17:09:35

标签: c++ exception memory memory-management c++11

是否可以在标准 C ++ 11中获得系统(x86,x64,PowerPC / Windows,Linux或MacOS)上的剩余可用内存而不会崩溃?

一种天真的方式是尝试从太大的大小开始分配非常大的数组,每次失败时捕获异常并减小大小直到没有抛出异常。但也许有一种更有效/更聪明的方法......

编辑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;
}

4 个答案:

答案 0 :(得分:8)

这高度依赖于操作系统/平台。你建议的方法甚至不需要在现实生活中工作。在某些平台上,操作系统会向你提供你所有的内存请求,但在你使用之前不会真正给你内存,此时你会得到一个SEGFAULT ......

标准有与此相关的任何内容。

答案 1 :(得分:2)

在我看来答案是不,你不能用标准C ++来做。

您可以做的是在How to get available memory C++/g++?下讨论,并在那里链接内容。这些都是平台特定的东西。它不是标准,但它最不能帮助您解决您正在处理的问题。

答案 2 :(得分:1)

正如其他人所提到的,这个问题难以准确定义,更不用说解决了。硬盘上的虚拟内存是否“可用”?如果系统实现删除文件的提示以获取更多硬盘空间,同时暂停程序,该怎么办? (这正是OS X上发生的情况。)

系统可能实现了一个内存层次结构,当你使用更多时,它会变慢。您可以尝试通过在使用C alarm中断工具或clocklocaltime / mktime时分配和初始化内存块来检测RAM和磁盘之间的性能悬崖,或者C ++ 11时钟设施。由于在效率较低的资源获取内存的压力下机器速度减慢,因此挂钟时间似乎会更快地通过。 (但这假设它没有被其他任何事情强调,例如另一个进程。)你想告诉用户程序正在尝试什么,并将结果保存到可编辑的配置文件中。

答案 3 :(得分:1)

我建议使用可配置的最大内存量。由于某些平台过度使用内存,因此要确定您实际可以访问多少内存并不容易。假设您拥有100%可用内存的独占访问权限也是不礼貌的,许多系统将运行其他程序。