C#中的数组有一些空间开销:它存储其同步块,其数组类型,可能是其元素类型(对于引用类型),其长度...
一些快速测试表明,数组的 elements 实际上是从缓存行边界开始的。例如,在byte[]
中,两个独立的线程分别同时更新索引63和64(因为它们在不同的缓存行上)要快于它们更新索引62和63(因为它们在相同的缓存行)。
我很想知道元数据的存储位置。它是否位于末尾,可能与最后几个元素位于同一缓存行中?还是将其完全存储在其他地方?
当尝试对某些阵列的使用进行缓存优化时,这可能会很有用。如果元数据存储在单独的缓存行中,那么在使用数组时,我们可能无能避免避免多余的缓存行填充。但是,如果将其存储在最后一个缓存行中,则可以优化数组大小以为元数据精确地留出足够的空间,并且可以按 first 首先探测该缓存行中的元素。仍然可用。