Kishor-KW Ответов: 1

Как определить или рассчитать размер класса


как рассчитать размер класса.

Что я уже пробовал:

class A
{

   int a;
   float f;

  public void cal();
  public void cal2();

}


каков размер этого класса?
как его рассчитать?

выделяется ли память для функции ?

является ли это объявление выделением памяти или

A a=new A();


выделит ли память?

1 Ответов

Рейтинг:
0

OriginalGriff

Методы не занимают места в экземпляре класса (хотя они занимают место в EXE-файле).
Вы можете легко получить размер цитаты класса, но ... вам это не нужно, за исключением тех случаев, когда вы разговариваете с неуправляемым кодом - и значение, которое вы получаете, вероятно, довольно запутанно.
Но...

int size = Marshal.SizeOf(typeof(Myclass));
Сказать вам.
Беги на свой класс:
[StructLayout(LayoutKind.Sequential)]
class Myclass
    {
    int a;
    float f;
    public void cal() { }
    public void cal2() { }
    }

Это даст вам "8", потому что int-это 4 байта, а float-4 байта. Но он не скажет вам, что вы думаете!
Если я добавлю к вашему классу:
[StructLayout(LayoutKind.Sequential)]
class Myclass
    {
    int a;
    float f;
    int[] array = new int[100000];
    public void cal() { }
    public void cal2() { }
    }
Как вы думаете, сколько это даст вам сейчас?
Ответ " 16 " - массив занимает 8 байт! Как? Потому что массив-это ссылка, и, как и все экземпляры класса, все, что содержит переменная, - это ссылка на фактические данные, а ссылка в 64-битной системе всегда составляет 8 байт, независимо от размера данных, на которые она ссылается.


Kishor-KW

таким образом, для класса создается только ссылка в 8 байт. и если в нем объявлен какой-либо другой ссылочный тип, то в нем будет добавлено 8.

класс Myclass
{
int a;
поплавок f;
чар с;
общественного недействительными кал() { }
общественного недействительными cal2 = хххххххх() { }
}

если мой класс все еще будет занимать 8 байт ?

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

и для каждого экземпляра выделяется память, если размер моего класса составляет 8 байт, и я создаю два его экземпляра, то это займет 16 байт памяти ?

OriginalGriff

"Память" не выделяется для метода, потому что вам нужна только одна его копия - все экземпляры класса используют один и тот же код.
(Это ложь для детей, так как код, который вы пишете, преобразуется в MSIL компилятором, который преобразуется в машинный код во время выполнения JIT на построчной основе, что все это занимает память-но это продвинутый материал, и вы действительно не хотите вдаваться в это еще!)

Нет, ваш класс не будет занимать 8 байт, если вы добавите к нему символ - он увеличится с 8 до 12, потому что значение символа занимает 2 байта (а данные всегда выровнены по границам, кратным 4, по огромному количеству причин, в которые я не хочу сейчас вдаваться (это всего лишь небольшое текстовое поле!).

Ссылка на данные-это не сами данные - вот почему они называются "ссылками"! Ссылка "указывает" на реальные данные в куче. Все классы являются ссылочными типами, в отличие от структур, которые являются типами значений.
Это, вероятно, не очень поможет:
https://www.codeproject.com/Articles/728836/Using-struct-and-class-whats-that-all-about
Но он пытается объяснить кое - что из того, что такое ссылка-и это важно, чтобы вы знали! Почитайте - это довольно просто для начала.

Если ваш класс имеет размер 8 байт и вы создаете два его экземпляра, то каждый экземпляр будет иметь отдельные 8 байт, поэтому для хранения их обоих потребуется 16 байт, да. (И это еще одна ложь детям - за кулисами происходит много вещей, которые вам пока не нужно знать, если вообще нужно, и это требует больше памяти).

CPallini

5.

Kishor-KW

ложь детям, Спасибо:) 5

OriginalGriff

Пожалуйста!
"Ложь детям" - это когда учитель не говорит вам всей правды-просто"все, что вы можете понять в данный момент". Как физика в школе-вам говорят, что атом-самая маленькая частица, а на следующий год говорят: "Ну, это не вся правда, атомы состоят из протонов, нейтронов и электронов, но они самые маленькие", а на следующий год начинают появляться кварки, и тогда электроны на самом деле не частицы, и они на самом деле не вращаются, и ... ..
"Ложь-детям": смех:
Учителя очень расстраиваются, когда вы используете эту фразу, и предпочитают такие вещи, как "соответствующие возрасту приближения", но это именно то, что они есть: ложь. ;)

Richard Deeming

Вы упустили все удовольствие, которое можете получить с размером упаковки по умолчанию! :)

OriginalGriff

Боюсь, еще больше лжи детям! :смеяться: