Является ли Microsoft Visual C ++ Compiler для Python 2.7 на http://www.microsoft.com/en-us/download/details.aspx?id=44266 не решением?
Короткий ответ:
Вы не сделали.
Длинный ответ:
Вы можете сделать это, только если вы набрали фиксированный макет и не имеете управляемых членов , Структуры фиксируются по умолчанию. Классы могут иметь фиксированный макет.
(Я не показываю, как это вам действительно не нужно. Это важно только при выполнении взаимодействия).
Следующее даст вам размер класса C #:
Marshal.SizeOf(typeof(Myclass));
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
class Myclass
{
}
Помните, что размер класса зависит от дополнения.
Вы можете сериализовать класс в поток памяти, а затем получить размер оттуда, но я бы не рекомендовал это делать, если только вам не пришлось.
Если вы используете оператор sizeof
, вы получите размер указателя (который будет одинаковым для всех объектов, очевидно).
Вы можете написать свой собственный метод и итерации ( используя отражение) по всем членам объекта (или тем, которые вас интересуют), и добавьте размер каждого отдельного члена.
Сложная часть сможет определить размер члена, который не является родным типы ... ваш метод должен быть несколько «рекурсивным».
Если бы вы реализовали вышеупомянутую идею, у вас был бы приблизительный размер объекта.
Большинство размещенных решений отличные и работают нормально, но у них есть ограничение на то, что ваш класс должен быть сериализуемым (подробнее см .: https://docs.microsoft.com/en-us/dotnet/standard / serialization / basic-serialization ) Однако, если вы не сериализуете класс, может оказаться полезным следующий код. Этот код учитывает тот факт, что использование ссылочного поля не является бесплатным, оно добавляет некоторые накладные расходы. Он также рассматривает использование среднего размера для строк, чтобы вы получили лучшее приближение.
/// <summary>
/// Gets the size of object.
/// </summary>
/// <param name="obj">The object.</param>
/// <param name="avgStringSize">Average size of the string.</param>
/// <returns>An approximation of the size of the object in bytes</returns>
public static int GetSizeOfObject(object obj, int avgStringSize=-1)
{
int pointerSize = IntPtr.Size;
int size = 0;
Type type = obj.GetType();
var info = type.GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
foreach (var field in info)
{
if (field.FieldType.IsValueType)
{
size += System.Runtime.InteropServices.Marshal.SizeOf(field.FieldType);
}
else
{
size += pointerSize;
if (field.FieldType.IsArray)
{
var array = field.GetValue(obj) as Array;
if (array != null)
{
var elementType = array.GetType().GetElementType();
if (elementType.IsValueType)
{
size += System.Runtime.InteropServices.Marshal.SizeOf(field.FieldType) * array.Length;
}
else
{
size += pointerSize * array.Length;
if (elementType == typeof(string) && avgStringSize > 0)
{
size += avgStringSize * array.Length;
}
}
}
}
else if (field.FieldType == typeof(string) && avgStringSize > 0)
{
size += avgStringSize;
}
}
}
return size;
}