Как определить, насколько велик тип данных в .NET?

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

Я знаю, что в .NET байтом является 8-разрядное целое число без знака, но только потому, что я читал об этом. Если у меня очень простое консольное приложение, например следующее:

static void Main(string[] args)
{
byte b = 1;
}

Как я могу узнать в Visual Studio, насколько велика структура данных "b"? Я вижу, что есть некоторые окна диагностики памяти, но только говорит, что они не могут оценить выражение, когда я перехожу к назначению b. У меня открыто окно дизассемблирования и вы можете увидеть mov op...

mov         dword ptr [ebp-40h],1

... но не уверен, что означает информация. Я думаю, что dword намекает на размер и, возможно, ptr ebp-40h указывает на адрес. Есть ли способ увидеть все адреса в Visual Studio и, возможно, получить размер, посмотрев на диапазон?

Я знаю, что это непростые вопросы, чтобы ответить на коротком форуме, как это, но спасибо за любую помощь.

Ответ 1

Вы можете использовать sizeof(T), чтобы получить размер примитивных типов значений и типов без ссылки. Для других типов может быть очень сложно получить размер, поскольку ссылочные типы обычно не имеют фиксированного размера.

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

Ответ 2

tl; dr: sizeof(YourType) должен дать вам "ответ", но Marshal.SizeOf может быть более подходящим.

Объяснение:

Это не всегда работает. С# не нравится, что вы нарушаете свой барьер абстракции, поэтому он позволяет вам найти "размер" структуры, если структура имеет одинаковый размер в управляемом и неуправляемом коде (или, точнее, "blittable" ). В противном случае, заявляет С#, "почему вы заботитесь об управляемом размере? Это бесполезно для вас" и не позволяет вам использовать sizeof управляемого типа.

Есть способы обойти это (через прямое генерирование MSIL), но если вы действительно хотите размер неуправляемого представления одного и того же объекта, тогда вы, вероятно, захотите использовать Marshal.SizeOf. sizeof на самом деле не так полезен, как кажется - он более удобен.

Ответ 3

Существует также хардкор SOS, который даст вам истинное значение для размера объекта.

Используйте команду !ObjSize

==Immediate Window==
.load sos
!ObjSize <address>

Вам может потребоваться щелкнуть, чтобы получить адрес объекта. Проверьте команды !Dump*, например !DumpHeap и !DumpStack.

Ответ 5

Я почти уверен, что то, о чем вы просите, - сколько памяти потребляет определенный тип данных? Я бы использовал метод sizeof(), поэтому для:

int a = 2;

Вы можете узнать, сколько пространства занимает int:

Console.WriteLine(sizeof(int);