Понимание памяти - PullRequest
       2

Понимание памяти

1 голос
/ 08 января 2010

В C # сохраняет ли следующее память?

private List<byte[]> _stream;
public object Stream
{
    get
    {
        if (_stream == null)
        {
            _stream = new List<byte[]>();
        }
        return _stream;
    }
}

Редактировать: извините, наверное, мне следовало быть более конкретным.

В частности, используя "объект" вместо List ... Я подумал, что это как-то подсказало бы себя, потому что это странно.

Ответы [ 6 ]

5 голосов
/ 08 января 2010

Экономит очень мало памяти. Объем памяти, который будет занимать пустая List<byte[]>, равен размеру байта.

Причина в том, что вашей ссылочной переменной _stream нужно всего лишь выделить достаточно памяти для хранения ссылки на объект. Как только объект выделен, он будет занимать определенный объем памяти, который может со временем увеличиваться или уменьшаться, например, когда к List добавляются новые byte[] s. Однако память, занятая ссылкой на этот объект, останется прежним размером.

Это проще и менее склонно к угловым случаям, которые вызывают у вас головные боли:

private List<byte[]> _stream = new List<byte[]>();
public object Stream
{
    get
    {
        return _stream;
    }
}

Хотя, в большинстве случаев, на самом деле не оптимально возвращать ссылки на закрытые элементы, когда они являются коллекциями / массивами и т. Д. Лучше вернуть _stream.AsReadOnlyCollection().

1 голос
/ 08 января 2010

Если ваша правка показывает, что вы спрашиваете, экономит ли память использование ключевого слова object вместо List<byte[]> в качестве типа свойства, нет, это не так. И ваш if блок сохраняет только незначительное количество памяти (и процессор при создании экземпляра) до при первом вызове свойства. И это делает первый вызов этого свойства немного медленнее. Подумайте о возврате нуля, если это имеет смысл для свойства. И, как предложил другой ответчик, может быть лучше оставить свойство доступным только для чтения, если вы не хотите, чтобы другие классы изменяли его. В целом, я бы сказал, что такие попытки оптимизации в основном ошибочны и делают ваш код менее обслуживаемым.

1 голос
/ 08 января 2010

Это ленивая загрузка. Вы создадите поток только тогда, когда кто-то запросит его. Он не будет создавать поток (в вашем случае список), если это не требуется.

Можно сказать, что он экономит некоторую память, потому что не будет использовать ее, если не потребуется. Поэтому перед использованием потока памяти для него не выделяется.

1 голос
/ 08 января 2010

Сохранить память по сравнению с чем?

 byte[][] _stream;

может быть? Тогда нет, List<T> будет занимать больше памяти, так как он является массивом в его основе (который не обязательно точно соответствует размеру его содержимого, но обычно больше), и некоторая поддержка состояния также должна быть выполнена.

0 голосов
/ 08 января 2010

Что такое объекты на самом деле

Я бы предложил думать об объектах как о структурах ... и ссылаться на объекты как указатели на эту структуру.

Если вы создаете экземпляр объекта, вы резервируете память для «структуры» со всеми ее полями (и ссылкой на класс, который он реализует), плюс всю память, зарезервированную конструктором (другие объекты, массивы и т. Д.) .

В List вы резервируете память для хранения состояний (я не знаю, как это реализовано в C #) и начальный внутренний массив, возможно, из десяти ссылок. Так что ... если вы посчитаете что-то вроде (при условии 32-битного времени выполнения, я не специалист по .net):

  • указатель на класс: 4 байта
  • указатель на массив: 4 байта
  • массив initialCapacity ссылки: 40 байт

Так что по моей оценке это около 48 байтов. Но это зависит от реализации.

Как говорит SoloBold: в большинстве случаев это не достойно.

0 голосов
/ 08 января 2010

Вы уверены, что поток не был бы просто байтом [] или списком байтов? Или даже лучше, MemoryStream? :) Я думаю, что вы несколько сбиты с толку, так что большой пример и некоторые детали сценария очень помогут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...