6

是否可以在标准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

4 回答 4

8

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

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

于 2013-02-21T17:13:55.340 回答
2

在我看来,答案是否定的,你不能在标准 C++ 中做到这一点。

如何获得可用内存 C++/g++?以及那里链接的内容。这些都是平台特定的东西。它不是标准的,但它至少可以帮助您解决正在处理的问题。

于 2013-02-21T18:35:55.003 回答
1

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

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

于 2013-02-22T00:12:06.000 回答
1

I would advise using a configurable maximum amount of memory instead. Since some platforms overcommit memory, it's not easy to tell how much memory you will actually have access to. It's also not polite to assume that you have exclusive access to 100% of the memory available, many systems will have other programs running.

于 2013-02-22T14:56:17.403 回答