2014-09-02 2 views
2

Я не знаю, если ранее кто-то спросил то же самое. Когда я попытался найти в сети, я не смог его найти. Пожалуйста, помогите мне в решении этого вопроса?Marshall.SizeOf сообщает о неожиданном размере массива структур в C#

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Runtime.InteropServices; 
    using System.Text; 
    using System.Threading.Tasks; 

    namespace ConsoleApplication1 
    { 
class Program 
{ 
     [StructLayout(LayoutKind.Sequential)] 
    public class Details 
    { 
     public uint ID; 
     public uint state; 
     public uint country; 
     public uint place; 
    } 
    [StructLayout(LayoutKind.Sequential)] 
    public class UserDetails 
    { 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst=8)] 
     public Details[] userDetails; 
    } 
    static void Main(string[] args) 
    { 

     UserDetails u = new UserDetails(); 
     int sizeofDetails = Marshal.SizeOf(u); 
    } 
} 
} 

Когда я выполнил код, я ожидал, что sizeofDetails должно быть 128. Но я получаю 64.

Есть ли какие-либо проблемы в объявлении массива. Кто-то может помочь?

+0

Уинт - 4 байта. – ForeverZer0

+0

Но почему результат 64? SizeOf находится над UserDetails, содержащим массив деталей. – user2864740

+0

извините за имена переменных .. На самом деле я получаю размер UserDetails. Что внутренне содержит массив размера 8. Каждый элемент в размере массива равен 16. Итак, я ожидаю 128-байтный размер. – chandrakanth

ответ

5

Изменить class Details на struct Details (и повторить для UserDetails). С изменениями выход должен быть 128, как ожидалось.

В исходном коде детали является типом Ссылки/Класса и Details[] представляет собой массив из 8 «ссылки на» Detail экземпляры и не массива значений STRUCT-подробно. Так как для каждой «ссылки» требуется 8 байтов, что имеет смысл на 64-битной платформе, тогда 8x8 = 64 (что является наблюдаемым выходом).


Я немного удивлен, что не было никакого предупреждения для применения StructLayout к классу, даже если класс является допустимая цель. Может быть, он добавлен ReSharper? Я уверен, что я где-то видел.

+0

Большое спасибо. После перехода из класса в структуру. Размер составляет 128. :) – chandrakanth

+0

+1. После беспорядка в VS, создающем тестовый проект, глядя на вид памяти, почесывая голову, я, наконец, тоже это заметил. Кроме того, у меня есть R #, и предупреждения не было. – Blorgbeard

Смежные вопросы