KeyValuePair<int, int>: 8 bytes
KeyValuePair<long, long>: 16 bytes
KeyValuePair<long, int>: 16 bytes (!!)
KeyValuePair<int, long>: 16 bytes (!!)
我希望后两对只需要8 (long) + 4 (int)
= 12个字节。为什么他们占16?
使用通过ILGenerator发出的动态SizeOf确定大小,如下所述:Size of generic structure
答案 0 :(得分:7)
归功于data structure Alignment。引用维基百科文章:
数据对齐意味着将数据放入存储器地址等于字大小的某个倍数,这会因CPU处理内存的方式而提高系统性能。为了对齐数据,可能需要在最后一个数据结构的末尾和下一个数据结构的开头之间插入一些无意义的字节,即数据结构填充。
由于int是4个字节,其KeyValuePair为long,而int将导致数据结构未对齐。这将导致性能显着下降。因此,最好在每条记录上“浪费”4个字节,以使数据对齐,从而能够有效地进行写入和读取。
至于为什么单个整数没有填充 - 不要忘记使用结构/类来添加填充变量相对容易 - 但对于普通值类型,你没有那个结构/类。我猜想所需的额外工作(在int周围添加一个虚拟结构以插入填充)不值得获得性能。
这里32位和64位操作系统之间确实没有区别,它们仍然需要填充和对齐,但填充量可能不同。
在“过去的日子”中,你经常不得不手动为数据结构添加填充以获得正确的对齐,现在它往往由编译器自动处理。