2013-06-19 3 views
4

Я пытаюсь проверить, работают ли ограничения памяти в моей ОС. Поэтому я использую это просто гр программу:Как проверить пределы памяти

#include <iostream> 
#include <cstdlib> 

int main() 
{ 
    const size_t GB = 1024 * 1024 * 1024; 
    const size_t mem = 1 * GB; 
    std::cout << "allocating " << mem << " bytes" << std::endl; 
    void* p = malloc(mem); 
    if (p) { std::cout << "memory allocated" << std::endl; } 
    else { std::cout << "cannot allocate memory" << std::endl; } 
    char a; 
    std::cin >> a; 
    free(p); 
} 

Я компиляция с -O0, но когда я смотрю на монитор производительности, я вижу, что мой a.out использует только 128Кб. Почему я не вижу 1 ГБ?

+0

Отметьте его как 'C++' .. – VoidPointer

+2

Поскольку вы не * действительно * не используете всю выделенную память. Начните писать случайные местоположения в нем, и вы увидите некоторые изменения. –

+1

... И чтобы развернуть комментарий от @VoidPointer, вместо этого используйте 'new' и' delete'. –

ответ

3

Вам необходимо зафиксировать память. Пока вы только резервируете его, вы выделили «виртуальную память». Вы совершаете чтение или запись памяти. С вашей программы просто добавить

void* p = malloc(mem); 
if (p) { 
    std::cout << "memory allocated" << std::endl; 
    memset(p, 0, mem); 
} else { 
    std::cout << "cannot allocate memory" << std::endl; } 

В операционной системе Windows, вы можете использовать функцию VirtualQuery, чтобы увидеть, что куски памяти резервируются и что совершается.

+0

спасибо, вы имеете в виду 'memset (p, 0, mem);' –

1

ОС будет использовать только «память», которую вы на самом деле трогаете, поэтому она не будет отображаться на мониторе производительности или например, если вы фактически не «используете» память. Это связано с тем, что некоторые приложения выделяют большие объемы памяти «на всякий случай», и потребовалось бы много дополнительного времени, чтобы ФАКТИЧЕСКИ заполнить эту память в процессе, когда на самом деле она не используется.

Смежные вопросы