Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么KeyValuePair<;整数,长>;16字节? KeyValuePair:8字节 KeyValuePair:16字节 KeyValuePair:16字节(!!) KeyValuePair:16字节(!!)_C#_Struct_Sizeof_Keyvaluepair - Fatal编程技术网

C# 为什么KeyValuePair<;整数,长>;16字节? KeyValuePair:8字节 KeyValuePair:16字节 KeyValuePair:16字节(!!) KeyValuePair:16字节(!!)

C# 为什么KeyValuePair<;整数,长>;16字节? KeyValuePair:8字节 KeyValuePair:16字节 KeyValuePair:16字节(!!) KeyValuePair:16字节(!!),c#,struct,sizeof,keyvaluepair,C#,Struct,Sizeof,Keyvaluepair,我希望后两对只需要8(long)+4(int)=12字节。为什么他们占16岁 尺寸是通过ILGenerator发出的动态尺寸来确定的,如下所述:这是由于。引用维基百科的文章: 数据对齐意味着将数据放在一个等于字大小的倍数的内存地址,这会由于CPU处理内存的方式而提高系统的性能。要对齐数据,可能需要在上一个数据结构的结尾和下一个数据结构的开头之间插入一些无意义的字节,这就是数据结构填充 因为int是4个字节,KeyValuePair为long和int会导致数据结构不对齐。这将导致性能显著下降。因此

我希望后两对只需要
8(long)+4(int)
=12字节。为什么他们占16岁

尺寸是通过ILGenerator发出的动态尺寸来确定的,如下所述:

这是由于。引用维基百科的文章:

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

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

至于为什么不填充单个整数——不要忘记,对于结构/类,添加填充变量相对容易——但是对于纯值类型,您没有该结构/类。我猜所需的额外工作(在int周围添加虚拟结构以插入填充)不值得获得性能增益

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


在“旧”时代,为了获得正确的对齐方式,您经常需要手动向数据结构添加填充,而现在它往往由编译器自动处理。

@PetSerAl我对这两种情况都有相同的结果,所以我对这两种情况都很好奇。我一直在期待类似的结果。但我也注意到,公共int不会得到任何填充,即使它不是8字节的倍数。是否可以接受其未对齐?这是一种权衡吗?“我们将有如此多的整数,我们希望通过性能来节省内存,但KeyValuePair将非常罕见,我们宁愿正确对齐它。”还是我遗漏了什么?另外,32位与64位在这里重要吗?大小不一定。@Timo不,32位对64位不重要。
KeyValuePair<int, int>:    8 bytes
KeyValuePair<long, long>: 16 bytes
KeyValuePair<long, int>:  16 bytes (!!)
KeyValuePair<int, long>:  16 bytes (!!)