Рейтинг:
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 байт, да. (И это еще одна ложь детям - за кулисами происходит много вещей, которые вам пока не нужно знать, если вообще нужно, и это требует больше памяти).
Kishor-KW
ложь детям, Спасибо:) 5
OriginalGriff
Пожалуйста!
"Ложь детям" - это когда учитель не говорит вам всей правды-просто"все, что вы можете понять в данный момент". Как физика в школе-вам говорят, что атом-самая маленькая частица, а на следующий год говорят: "Ну, это не вся правда, атомы состоят из протонов, нейтронов и электронов, но они самые маленькие", а на следующий год начинают появляться кварки, и тогда электроны на самом деле не частицы, и они на самом деле не вращаются, и ... ..
"Ложь-детям": смех:
Учителя очень расстраиваются, когда вы используете эту фразу, и предпочитают такие вещи, как "соответствующие возрасту приближения", но это именно то, что они есть: ложь. ;)
Richard Deeming
Вы упустили все удовольствие, которое можете получить с размером упаковки по умолчанию! :)
OriginalGriff
Боюсь, еще больше лжи детям! :смеяться: