Насколько велики 1000 дважды? - PullRequest
0 голосов
/ 31 марта 2019

Я изучаю c ++, и в одном уроке был код, посвященный обработке исключений. Код не мой, это просто пример для «попробуй и поймай». Так что этот вопрос не о качестве кода

Мой вопрос к этому коду: действительно ли вывод и расчет объема памяти верны? Когда я выделяю блок памяти с new double(1000), разве размер не равен 8000 байт?

Выход cerr считается только 1 КБ вместо 8 КБ. Я не прав?

Я получил размер 1 double с sizeof(double), чтобы подтвердить, что это 8 байтов.

#include <iostream>
#include <cstdlib>
#include <new>
using namespace ::std;
int main()
{
    int i = 0;
    double *q;

try
{
    while (1)
    {
        q = new double[1000];
        i++;
    }
}
catch (bad_alloc &ex)
{
    cerr << "The memory is used up.  " << i
         << " Kilobyte were available." << endl;
    exit(1);
}
}

Ответы [ 2 ]

3 голосов
/ 31 марта 2019

Подводя итог тому, что @Peter сказал в своем комментарии: Ваша переменная i считает количество выделений , а не общий объем выделенной памяти.

Обратите внимание, однако, что даже если вы «исправите» это, вы получите не количество «доступной памяти» и даже не объем доступной памяти, округленный до кратного 8000. Это потому, что » «Доступная память» - не очень четкое понятие. Операционная система может быть готова позволить вам выделить миллион байтов; но он может на самом деле не делать ничего видимого для других процессов, пока вы не начнете запись в эту память. И даже если вы сделаете запись на него - он может поменять неиспользуемые страницы памяти на жесткий диск / SSD, чтобы освободить место для страниц, над которыми вы работаете.

Если вы хотите проверить, какой максимальный объем памяти вы можете выделить с помощью new, вы можете рассмотреть возможность использования процедуры, подобной бинарному поиску, для получения размера; Я не буду разъяснять это, если это твоя домашняя работа. (И, конечно, это тоже не будет точным, поскольку использование памяти другими процессами колеблется.)

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


Наконец, некоторые клыки:

  • Вы используете противоречивые отступы. Это сбивает с толку.
  • i не очень хорошее имя для переменной. num_allocations подошло бы лучше. Когда вы используете более значимое имя, вы также фиксируете его семантику, что затрудняет их перепутывание.
  • Старайтесь избегать «магических чисел», таких как 1000. Определите константы, используя enum или constexpr. Например: enum { Kilo = 1000 };.
  • Кажется, нет веской причины использовать double в такой программе, которая не имеет ничего общего с арифметикой с плавающей точкой.
1 голос
/ 31 марта 2019

Вы абсолютно правы.Должно быть:

cerr << "The memory is used up.  " << sizeof(double) * i
     << " Kilobyte were available." << endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...