Как получить доступную память C++/g ++?

вызвать функцию addArray из функции DoStuff и передать ей numArray в качестве параметра

function DoStuff() {

let numArray;
let sumArray;
let start = 1;
let end = 5;

if (start > end){
    alert("Error: first int greater than last!")
}
else {
    let arraySize = end - start;
    numArray = [start];
    for (let x = start + 1; x <= end; ++x){
        numArray.push(x);
    }    
}
addArray(numArray)
}

function addArray(numArray){
        console.log(numArray); 
}
61
задан theCakeCoder 5 July 2016 в 08:12
поделиться

6 ответов

в настоящее время свободная память Linux: sysconf(_SC_AVPHYS_PAGES) и get_avphys_pages()

общая RAM была покрыта в https://stackoverflow.com/a/2513561/895245 с sysconf(_SC_PHYS_PAGES);.

И sysconf(_SC_AVPHYS_PAGES) и get_avphys_pages() glibc расширения POSIX, которые дают вместо этого общие в настоящее время доступные страницы RAM.

тогда просто необходимо умножить их на sysconf(_SC_PAGE_SIZE) для получения текущей свободной RAM.

Минимальный выполнимый пример в: C - Проверка доступная бесплатно RAM?

0
ответ дан 24 November 2019 в 16:58
поделиться

В 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 s, и все будет хорошо.

141
ответ дан 24 November 2019 в 16:58
поделиться

Нет независимого от платформы способа сделать это, разные операционные системы используют разные стратегии управления памятью.

Эти другие вопросы о переполнении стека помогут:

Вы должны быть осторожны: это общеизвестно сложно получить «реальное» значение доступной памяти в Linux. То, что операционная система отображает как используемое процессом, не является гарантией того, что фактически выделено для процесса.

Это обычная проблема при разработке встроенных систем Linux, таких как маршрутизаторы, где вы хотите буферизовать столько, сколько позволяет оборудование. Вот ссылка на пример, показывающий, как получить эту информацию в Linux (на C):

12
ответ дан 24 November 2019 в 16:58
поделиться

Пример Mac OS X с использованием sysctl ( man 3 sysctl ):

#include <stdio.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/sysctl.h>

int main(void)
{
    int mib[2] = { CTL_HW, HW_MEMSIZE };
    u_int namelen = sizeof(mib) / sizeof(mib[0]);
    uint64_t size;
    size_t len = sizeof(size);

    if (sysctl(mib, namelen, &size, &len, NULL, 0) < 0)
    {
        perror("sysctl");
    }
    else
    {
        printf("HW.HW_MEMSIZE = %llu bytes\n", size);
    }
    return 0;
}

(также может работать в других BSD-подобных операционных системах ?)

5
ответ дан 24 November 2019 в 16:58
поделиться

"Официальной" функцией для этого является было std :: get_hibited_buffer () . Однако вы можете проверить, есть ли у вашей платформы достойная реализация. Я понимаю, что не все платформы ведут себя должным образом.

3
ответ дан 24 November 2019 в 16:58
поделиться

Рассматривали ли вы, вместо того, чтобы пытаться угадать, позволить пользователю настроить, сколько памяти использовать для буферов, а также принять несколько консервативные значения по умолчанию? Таким образом, вы все равно можете работать (возможно, немного медленнее) без переопределения, но если пользователь знает, что для приложения доступна X-память, он может повысить производительность, настроив этот объем.

1
ответ дан 24 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: