4
votes

I'm new in C#.
I'm trying to understand why the struct size is grow.
I.e:

struct Test
{
    float x;
    int y;
    char z;
}

size of Test struct is actually 10 bytes (float=4, int=4, char=2).
But when i tried to get the sizeof struct with Marshal.SizeOf(..) method i got 12.
In C++ i did pragma pack(1) to prevent this but how can i do it in C#?

Another question:
When i tried to convert the Test struct to byte array if the struct isn't [Serialize] i got byte array with size 12 bytes as excepted (or not), but if the struct is [Serialize] i got byte array with size of 170 bytes, why its happend?
Thanks! :)

1
When i tried to convert the Test struct to byte array How are you trying to do it? - xanatos
if the struct isn't [Serialize] i convert is with this method stackoverflow.com/questions/3278827/… (the checked answer) and if soi convert it with stackoverflow.com/questions/628843/… (the last answer) - Evyatar
Bear in mind that if you're using the Marshaller or serialization - you're not measuring the size of the struct. You're measuring the size of the unmanaged equivalent, or of the serialized form. Neither is necessarily related to the size of the struct itself. - Damien_The_Unbeliever
@Damien_The_Unbeliever, i dont use Marshal to know the sizeof serazlied struct. - Evyatar
What I mean is the Marshal.SizeOf: "The size returned is the size of the unmanaged type. The unmanaged and managed sizes of an object can differ" - Damien_The_Unbeliever

1 Answers

10
votes

This

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct TestStruct
{
    float x;
    int y;
    char z;
}

will give a Marshal.SizeOf() == 9, because Marshal.SizeOf(typeof(char)) == 1 for strange historical reasons.

BUT

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]

with this you'll get Marshal.SizeOf() == 10