Is it 12 bytes or 16 bytes when stored in a List<DataPoint>
?
public struct DataPoint
{
DateTime time_utc;
float value;
}
Is there any sizeof function in C#?
Is it 12 bytes or 16 bytes when stored in a List<DataPoint>
?
public struct DataPoint
{
DateTime time_utc;
float value;
}
Is there any sizeof function in C#?
The CLR is free to lay out types in memory as it sees fit. So it's not possible to directly give "the" size.
However, for structures it's possible to restrict the freedom of the CLR using the StructLayout Attribute:
The C# compiler automatically applies the Sequential layout kind to any struct. The Pack value defaults to 4 or 8 on x86 or x64 machines respectively. So the size of your struct is 8+4=12 (both x86 and x64).
Unrelated from how a type is laid out in memory, it's also possible to marshal a type in .NET using the Marshal Class. The marshaller applies several transformations when marshalling a type, so the result is not always the same as the way the CLR laid out the type. (For example, a
bool
takes 1 byte in memory plus alignment, while the marshaller marshals abool
to 4 bytes.)The following code is based on this StackOverflow question and answers:
I think the question you are probably wondering, is not what is the size of the type but what is the distance between two contiguous elements in the List. This is because alignment can play a role, as mentioned by others.
I believe the solution to that problem would best be achieved using
Marshal.UnsafeAddrOfPinnedArrayElement()
, but is very difficult to use correctly, particularly because theList
does not expose publicly the backing array.Take a look at @Hans Passant's answer here for interesting background on this issue, esp. with regard to the limitations of
Marshal.Sizeof
.It will be 12 bytes (4 for float, 8 for DateTime);
Marshal.SizeOf
will return 16 because the default packing is 8 bytes aligned. This is a good article on structs and packing. It gives a full description of whats actually happening.Try Marshal.SizeOf(typeof(DataPoint))
Marshal.SizeOf()
http://msdn.microsoft.com/en-us/library/y3ybkfb3.aspx