为什么KeyValuePair16字节

本文关键字:long 16字节 int KeyValuePair 为什么 | 更新日期: 2023-09-27 18:32:50

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 确定的,如下所述:通用结构的大小

为什么KeyValuePair<int,long>16字节

这是

由于数据结构对齐。引用维基百科文章:

数据对齐意味着将数据放在等于字大小的某个倍数的内存地址上,由于 CPU 处理内存的方式,这提高了系统的性能。为了对齐数据,可能需要在最后一个数据结构的末尾和下一个数据结构的开头之间插入一些无意义的字节,即数据结构填充。

由于 int 是 4 个字节,具有长整型的键值对,而 int 将导致数据结构未对齐。这将导致性能显著下降。因此,最好在每条记录上"浪费"4个字节,以使数据对齐,从而能够有效地写入和读取。

至于为什么单个整数没有填充 - 不要忘记结构/类,添加填充变量相对容易 - 但对于普通值类型,您那里没有该结构/类。我猜所需的额外工作(在 int 周围添加一个虚拟结构以插入填充(不值得性能提升。

这里 32 位和 64 位操作系统之间实际上没有区别,它们仍然需要填充和对齐,但填充量可能会有所不同。

在"过去",您经常必须手动向数据结构添加填充以获得正确的对齐方式,如今它往往由编译器自动处理。