为何Dictionary<long, ValueTuple<int,int>>与Dictionary<long, ValueTuple<ushort,ushort>>内存占用相同?
问题原因解析
这是由于.NET在x64平台下的内存对齐机制导致的,具体细节如下:
- x64架构下,.NET要求值类型的内存大小向上对齐到8字节(与指针长度一致)。
- 对于
(ushort foo, ushort bar)这个值元组,两个ushort字段合计仅4字节,但内存对齐规则会自动填充额外4字节,使其总大小达到8字节。 - 而
(int foo, int bar)的两个int字段各占4字节,合计正好8字节,无需额外填充。 - Dictionary存储键值对时,每个条目里的Value部分会占用对齐后的完整内存空间。两种情况里每个Value的实际占用都是8字节,加上Key的long类型(8字节),每个键值对总占用16字节,因此整个Dictionary的内存占用完全一致。
你可以通过以下代码验证值类型的实际大小:
Console.WriteLine(Unsafe.SizeOf<(ushort, ushort)>()); // 输出8 Console.WriteLine(Unsafe.SizeOf<(int, int)>()); // 输出8
内容的提问来源于stack exchange,提问作者Ish Thomas
相关产品推荐
相关产品推荐

