2010-01-08 2 views
1

В C# сохраняются ли какие-либо память?Общие сведения о памяти

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

Edit: извините, я предполагаю, что я должен был быть более конкретным.

В частности, с помощью «объекта» вместо списка ... Я думал, что это будет любопытно, потому что это странная вещь.

+1

В противоположность возврату нового _stream каждый раз? –

+6

Сохраняет ли память память по сравнению с какой альтернативой? Вопрос слишком расплывчатый. – Nick

+0

Что на самом деле вопрос? вот почему, почему бы и нет? –

ответ

5

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

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

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

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

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

1

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

byte[][] _stream; 

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

0

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

0

Какие объекты действительно

Я предлагаю думать в объектах, как ... и структур ссылки на объекты в качестве указателей на эту структуру.

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

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

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

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

Как говорит СолоБолд: чаще всего это недопустимо.

+1

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

+0

MMm может быть, мой пост вводит в заблуждение. Когда я проводил CS, мои первые классы, где были абсурдные абстрактные типы данных, и мы использовали функции над указателями на структуры. Это было довольно близко к объектам, не потому что структуры были объектами, а потому, что ссылка на объект реализуется указателем на структуру. Когда вы делаете «Клиент a = новый клиент()», это как «StClient * a = malloc (sizeof (StClient)»), где StClient имеет все поля объекта Client (я игнорирую подобъекты). Если вы думаете о том, какие части памяти работают за сценой, все изображение становится ясным. – helios

1

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

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

1

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

+0

Спасибо, хорошие баллы – Skawful

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