Пустая переменная имеет тот же размер, что и заполненная переменная в C # - PullRequest
1 голос
/ 29 сентября 2019

Это фундаментальный вопрос, мне нужно запретить использование моего кода в C #. Интересно, если я инициирую класс A (скажем, у него есть 10 переменных), и я заполняю все переменные значениями. В другом случае я инициирую класс A и заполняю значениями только 2 переменные, а остальное будет нулевым или пустым, если это строка. Будет ли в первом случае более высокое потребление памяти?

Ответы [ 2 ]

1 голос
/ 29 сентября 2019

Возможно. Если свойство вашего класса является объектом, то если вы назначите этому свойству, вам будет выделена некоторая память из-за этого объекта. Пример:

class House{
   object TV {get; set;}
}

Если вы сделаете

var house= new House() {
    TV= new {height= 100, width=1000}
};

, это займет больше времени, так как теперь объект TV занимает место в дополнение к ссылке * TV1 1011 * .

Если в качестве свойства у вас есть простой тип значения:

class House{
       int Price {get; set;}
    }

Ничего не изменится с

var house = new House(); 

или

var house = new House(){ Price=20000 };

Это потому, что Price будет установлено в значение int по умолчанию (то есть 0), и каждый int будет занимать одинаковое пространство независимо от его значения.

0 голосов
/ 29 сентября 2019

Да, пустая переменная имеет тот же размер, что и заполненная переменная в C #, если переменная является типом значения или ссылкой: она занимает то же пространство памяти.

Например, int занимает 4 байта и long занимает 8 байтов.

То же самое для ссылок, назначенных или нет.

Ссылка на x32 занимает 4 байта, но в x64 - 8 байтов.

КаждыйТип значения принимает размер значения с добавлением размера скрытого скрытого указателя (скрытой ссылки).

Если он не одинаковый, размер для всех типов основан на массивах, таких как value[] и строках:в этом случае начальный размер равен размеру указателя, а затем пространство увеличивается при заполнении данных.

Следовательно, объем памяти массива int увеличивается при добавлении целых чисел, и он равен строке

Это потому, что иногда предпочтительнее использовать StringBuilder вместо String и избегать использования ToList (), например, когда он бесполезен.

К этому необходимо добавитьРекомендацииметодов и виртуальных таблиц.

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

using System.Runtime.Serialization.Formatters.Binary;

static public long SizeOf(object obj)
{
  if ( obj == null ) return 0;
  try
  {
    using ( MemoryStream stream = new MemoryStream() )
    {
      new BinaryFormatter().Serialize(stream, obj);
      return stream.Length;
    }
  }
  catch 
  { 
    return -1; 
  }
}
...