因此,英特尔的I7处理器内存以64字节写入和读取。 因此,如果我想填充缓存行,我可以使用16个long(每个4个字节)。
如果一个16个long的数组,是否适合整个缓存行,或者是否有一些数组开销?
我担心的是,如果一个数组有任何开销,并且我使用16个long,那么总的大小(以字节为单位)将溢出超过64个。
那么它更像new long[63]
,还是new long[62]
等?
答案 0 :(得分:0)
在C#中,long
数据类型是System.Int64
的别名,是8个字节,而不是4. int
类型,即System.Int32
,是4字节。因此,64个字节的long
值是8个元素,而不是16个。
托管阵列的存储实际上是连续的,因此理论上是的,long[8]
恰好适合64字节的高速缓存行。但请注意,只有在64的倍数的地址上正确对齐才能这样做。由于您无法控制分配位置,这将很难做到。
因此,即使没有数组中的开销,也无法保证long
的单个8元素数组实际上恰好适合64字节的高速缓存行。
当然,长于此的数组将具有对齐的子范围,因此可以完全缓存。但是,对于您可能拥有的任何数据类型而言,这都是正确的。坦率地说,要担心的不是数据的大小或数组的长度,而是访问模式。有关如何以有助于确保有效使用缓存的方式访问数据的建议,请参阅“数据位置”。