存储在List<DataPoint>
?
public struct DataPoint
{
DateTime time_utc;
float value;
}
C#中是否有sizeof函数?
答案 0 :(得分:14)
请看看@Hans Passant的回答here,了解有关此问题的有趣背景,尤其是关于Marshal.Sizeof
的限制。
答案 1 :(得分:7)
Marshal.SizeOf()
答案 2 :(得分:7)
CLR可以根据需要在内存中自由布局类型。所以不可能直接给出“尺寸”。
但是,对于结构,可以使用StructLayout Attribute来限制CLR的自由:
C#编译器会自动将顺序布局类型应用于任何结构。 x86或x64计算机上的 Pack 值分别默认为4或8。所以你的结构的大小是8 + 4 = 12(x86和x64)。
不相关从类型在内存中的布局方式来看,也可以使用Marshal Class封送.NET中的类型。编组器在编组类型时应用了几个转换,因此结果并不总是与CLR布局类型的方式相同。 (例如,bool
在内存中占用1个字节加上对齐,而编组器将bool
编组为4个字节。)
答案 3 :(得分:3)
它将是12个字节(浮点数为4,DateTime为8);
Marshal.SizeOf
将返回16,因为默认打包是8字节对齐。
This是关于结构和包装的好文章。它完整地描述了实际发生的事情。
答案 4 :(得分:0)
尝试使用Marshal.SizeOf(typeof(DataPoint))
答案 5 :(得分:0)
以下代码基于this StackOverflow question and answers:
/// <summary>
/// Computes the size of the given managed type. Slow, but reliable. Does not give the same result as Marshal.SizeOf
/// NOTE: this is not the same as what is the distance between these types in an array. That varies depending on alignment.
/// </summary>
public static int ComputeSizeOf(Type t)
{
// all this just to invoke one opcode with no arguments!
var method = new DynamicMethod("ComputeSizeOfImpl", typeof(int), Type.EmptyTypes, typeof(Util), false);
var gen = method.GetILGenerator();
gen.Emit(OpCodes.Sizeof, t);
gen.Emit(OpCodes.Ret);
var func = (Func<int>)method.CreateDelegate(typeof(Func<int>));
return func();
}
我认为您可能想知道的问题不是类型的大小,而是列表中两个连续元素之间的距离是多少。正如其他人所提到的,这是因为对齐可以发挥作用。
我相信使用Marshal.UnsafeAddrOfPinnedArrayElement()
可以最好地解决该问题,但是很难正确使用,尤其是因为List
不会公开公开支持数组。