C# 一个8个长的数组是否可以放入64字节缓存线?

C# 一个8个长的数组是否可以放入64字节缓存线?,c#,caching,C#,Caching,因此,在英特尔I7处理器上,内存的写入和读取速度为64字节。 因此,如果我想填充缓存线,我可以使用16个长4字节 如果一个数组的长度为16,那么它是否适合整个缓存线,或者该数组是否有一些开销 我担心的是,如果一个数组有任何开销,并且我使用16个long,那么以字节为单位的总大小将溢出64个字节 那么它更像是new long[63]还是new long[62]等等呢?在C中,long数据类型(System.Int64的别名)是8字节,而不是4字节。int类型aka System.Int32是4字节

因此,在英特尔I7处理器上,内存的写入和读取速度为64字节。 因此,如果我想填充缓存线,我可以使用16个长4字节

如果一个数组的长度为16,那么它是否适合整个缓存线,或者该数组是否有一些开销

我担心的是,如果一个数组有任何开销,并且我使用16个long,那么以字节为单位的总大小将溢出64个字节

那么它更像是new long[63]还是new long[62]等等呢?

在C中,long数据类型(System.Int64的别名)是8字节,而不是4字节。int类型aka System.Int32是4字节。所以64字节的长值是8个元素,而不是16个

托管阵列的存储实际上是连续的,因此理论上是的,长[8]正好适合64字节缓存线。但请注意,只有在地址是64的倍数时正确对齐,它才会这样做。由于您无法控制分配位置,所以很难做到这一点

因此,即使没有阵列中的开销,也不能保证单个8元素long数组实际上能够完全适合64字节缓存线


当然,长度超过该值的数组将具有对齐的子范围,因此可以完全缓存。但对于您可能拥有的几乎所有数据类型来说都是如此。坦率地说,需要担心的不是数据的大小或数组的长度,而是访问模式。有关如何以有助于确保高效使用缓存的方式访问数据的建议,请参阅数据位置。

为什么您认为可以直接写入缓存?@NoIdeaForName我不这么认为。但我知道cpu有三层缓存,第三层在获取值时从主内存读取64字节。一个.NET数组肯定有开销。大约20字节左右。但1MB阵列仍将从缓存中获益,每次64字节。