Получение размера поля в байтах с C#

60
задан Shaun Luttin 4 February 2017 в 18:43
поделиться

4 ответа

В зависимости от потребностей questionee, Маршала. SizeOf мог бы или не мог бы дать Вам, что Вы хотите. (Отредактированный после того, как Jon Skeet отправил свой ответ).

using System;
using System.Runtime.InteropServices;

public class MyClass
{
    public static void Main()
    {
        Int32 a = 10;
        Console.WriteLine(Marshal.SizeOf(a));
        Console.ReadLine();
    }
}

Примечание, что, поскольку jkersch говорит, sizeof, может использоваться, но к сожалению только с типами значения. Если Вам нужен размер класса, Маршала. SizeOf является способом пойти.

Jon Skeet разметил почему ни sizeof, ни Маршал. SizeOf прекрасен. Я предполагаю, что questionee должен решить, приемлем ли любой для его проблемы.

17
ответ дан 3 revs 24 November 2019 в 17:39
поделиться

Вы не можете в основном. Это будет зависеть от дополнения, которое может быть основано на версии CLR, которую Вы используете и процессор и т.д. Легче разработать общий размер объекта, предполагая, что это не имеет никаких ссылок на другие объекты: создайте большой массив, используйте GC.GetTotalMemory для базисной точки, заполните массив ссылками на новые экземпляры Вашего типа, и затем назовите GetTotalMemory снова. Примите одно значение далеко от другого и разделитесь на количество экземпляров. Необходимо, вероятно, создать единственный экземпляр заранее, чтобы удостовериться, что никакой новый код JITted не способствует числу. Да, это как hacky, поскольку это звучит - но я использовал его успешно до настоящего времени.

Только вчера я думал, что это будет хорошая идея записать немного класса помощника для этого. Сообщите мне, было ли Вам интересно.

РЕДАКТИРОВАНИЕ: существует два других предложения, и я хотел бы обратиться к ним обоим.

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

Затем, Маршал. SizeOf: это только показывает неуправляемый размер после маршалинга, не фактического размера в памяти. Поскольку документация явно указывает:

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

И снова, дополнение может иметь значение.

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

class FourBytes { byte a, b, c, d; }
class FiveBytes { byte a, b, c, d, e; }

На моем x86 поле, экземпляр FourBytes берет 12 байтов (включая издержки). Экземпляр FiveBytes берет 16 байтов. Единственная разница "e" является переменным - таким образом, это берет 4 байта? Ну, вид... и вид нет. Справедливо, очевидно, Вы могли удалить любую единственную переменную из FiveBytes для возвращения размера вниз к 12 байтам, но это не означает, что каждый из переменных поднимает 4 байта (думайте об удалении всех их!). Стоимость единственной переменной просто не является понятием, которое имеет много смысла здесь.

99
ответ дан Jon Skeet 24 November 2019 в 17:39
поделиться

если у Вас есть тип, используйте sizeof оператор. это возвратит размер типа в байте. например,

Консоль. WriteLine (sizeof (интервал));

произведет:

4

1
ответ дан Joachim Kerschbaumer 24 November 2019 в 17:39
поделиться

. СЕТЕВОЕ Ядро только

Использование System.Runtime.CompilerServices.Unsafe.SizeOf<T>() where T: unmanaged

Документация состояния:

Возвраты размер объекта данного параметра типа.

Это, кажется, использует sizeof IL-инструкция так же, как , решение Earlz делает также. ( источник )

unmanaged ограничение является новым в C# 7.3

0
ответ дан 24 November 2019 в 17:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: