C# Marshal.SizeOf
Я использую Marshal.SizeOf, чтобы узнать размер моей структуры:
struct loginStruct
{
public string userName;
public string password;
public loginStruct(string userName, string password)
{
this.userName = userName;
this.password = password;
}
}
Вот использование этой функции:
int len = Marshal.SizeOf(typeof(loginStruct));
Я получил 2 программы. В одной программе len равно 8. В другой - 16. Это та же самая структура. Почему я получил эту разницу?
3 ответа
Я предполагаю, что одна программа скомпилирована для AnyCPU (которая на 64-битной платформе будет 64-битной), а другая - для 32-битной.
Методы не влияют на заданный размер, поэтому мы говорим о следующем:
struct loginStruct
{
public string userName;
public string password;
}
Тот struct
имеет два поля ссылочного типа. Как таковой, он имеет два поля в памяти, которые относятся к объектам в куче, или к null
,
Все поля ссылочного типа составляют 4 байта в 32-битном.NET и 8 байтов в 64-битном.NET.
Следовательно, размер будет 4 + 4 = 8 в 32-битном.NET или 8 + 8 = 16 в 64-битном.NET.
Это зависит от машины и конфигурации сборки. Как сказал @Joey AnyCPU или 64-битный
Есть несколько хитростей, чтобы избежать этой проблемы:
Например, вы можете проверить:
Тип приложения Environment.Is64BitOperatingSystem
Размер IntPtr меняется на 32 и 64
использование System.Runtime.InteropServices.Marshal.SizeOf(typeof(Win32DeviceMgmt.SP_DEVINFO_DATA)