为了账号安全,请及时绑定邮箱和手机立即绑定

如何获得可用内存C ++ / g ++?

如何获得可用内存C ++ / g ++?

C++
当年话下 2019-11-27 10:40:21
我想根据可用内存分配缓冲区。这样,当我进行处理时,内存使用率上升了,但仍然保持在可用内存限制内。有没有一种方法来获取可用内存(我不知道虚拟或物理内存状态会有所不同吗?)。方法必须与平台无关,因为它必须在Windows,OS X,Linux和AIX上使用。(如果可能的话,我还想为我的应用程序分配一些可用的内存,在执行过程中它不会改变)。编辑:我做到了可配置的内存分配。我知道这不是一个好主意,因为大多数操作系统都为我们管理内存,但是我的应用程序是ETL框架(打算在服务器上使用,但也作为Adobe indesign的插件在桌面上使用)。因此,我遇到了问题,因为Windows而不是使用swap,而是会返回错误的alloc,而其他应用程序则开始失败。正如我被教导要避免崩溃那样,所以,我只是试图优雅地降级。
查看完整描述

3 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

阅读完这些答案后,我感到惊讶的是,有这么多人以为OP的计算机内存属于他人。这是他的电脑,他的记忆做,因为他认为合适的,即使它伤了其他系统采取了要求它。这是一个有趣的问题。在一个比较原始的系统上,我memavail()会告诉我这一点。为什么OP不占用其他系统就不会占用他过多的内存?


这是一种分配少于一半可用内存的解决方案。输出为:


必填FFFFFFFF


必填7FFFFFFF


必填3FFFFFFF


分配的内存大小= 1FFFFFFF


#include <stdio.h>

#include <stdlib.h>


#define MINREQ      0xFFF   // arbitrary minimum


int main(void)

{

    unsigned int required = (unsigned int)-1; // adapt to native uint

    char *mem = NULL; 

    while (mem == NULL) {

        printf ("Required %X\n", required);

        mem = malloc (required);

        if ((required >>= 1) < MINREQ) {

            if (mem) free (mem);

            printf ("Cannot allocate enough memory\n");

            return (1);

        }

    }


    free (mem);

    mem = malloc (required);

    if (mem == NULL) {

        printf ("Cannot enough allocate memory\n");

        return (1);

    }

    printf ("Memory size allocated = %X\n", required);

    free (mem);

    return 0;

}


查看完整回答
反对 回复 2019-11-27
?
holdtom

TA贡献1805条经验 获得超10个赞

在类似UNIX的操作系统上,存在sysconf。


#include <unistd.h>


unsigned long long getTotalSystemMemory()

{

    long pages = sysconf(_SC_PHYS_PAGES);

    long page_size = sysconf(_SC_PAGE_SIZE);

    return pages * page_size;

}

在Windows上,有GlobalMemoryStatusEx:


#include <windows.h>


unsigned long long getTotalSystemMemory()

{

    MEMORYSTATUSEX status;

    status.dwLength = sizeof(status);

    GlobalMemoryStatusEx(&status);

    return status.ullTotalPhys;

}

因此,只需花一些时间#ifdef,您就可以开始了。


查看完整回答
反对 回复 2019-11-27
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

对于科学软件,有理由要在HPC中执行此操作。(不是游戏,网络,商业或嵌入式软件)。科学软件通常会遍历数TB的数据来进行一次计算(或运行)(并运行数小时或数周)-所有这些数据都无法存储在内存中(如果有一天您告诉我,TB对任何PC都是标准的或平板电脑或手机,科学软件的处理能力有望达到PB或更高。内存量还可以决定有意义的方法/算法的种类。用户并不总是要决定存储和方法-他/她还有其他事情要担心。因此,程序员应该对可用的内容(近来的4Gb或8Gb或64Gb左右)有一个好主意,以决定一种方法将自动运行还是要选择一种更费力的方法。使用磁盘,但最好使用内存。并且不鼓励此类软件的用户在运行此类软件时在其计算机上执行过多操作-实际上,他们经常使用专用的机器/服务器。


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 457 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信