编程语言
首页 > 编程语言> > c# – 为什么KeyValuePair是16个字节?

c# – 为什么KeyValuePair是16个字节?

作者:互联网

KeyValuePair<int, int>:    8 bytes
KeyValuePair<long, long>: 16 bytes
KeyValuePair<long, int>:  16 bytes (!!)
KeyValuePair<int, long>:  16 bytes (!!)

我希望后两对只需要8(长)4(int)= 12字节.为什么他们占16?

使用通过ILGenerator发出的动态SizeOf确定大小,如下所述:Size of generic structure

解决方法:

这是由于data structure Alignment.引用维基百科的文章:

Data alignment means putting the data at a memory address equal to some multiple of the word size, which increases the system’s performance due to the way the CPU handles memory. To align the data, it may be necessary to insert some meaningless bytes between the end of the last data structure and the start of the next, which is data structure padding.

由于int是4个字节,其KeyValuePair为long,而int将导致数据结构未对齐.这将导致性能显着下降.因此,最好在每条记录上“浪费”4个字节以使数据对齐,从而能够有效地写入和读取数据.

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

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

在“过去的日子”中,您经常需要手动向数据结构添加填充以获得正确的对齐,现在它往往由编译器自动处理.

标签:c,struct,sizeof,keyvaluepair
来源: https://codeday.me/bug/20190611/1220541.html