C++ 我们可以从C++;密码?

C++ 我们可以从C++;密码?,c++,caching,boost,C++,Caching,Boost,今年有很多视频/教程/讲座,讨论可以存储在缓存中的向量和对象值数组的重要性。然而,我还没有找到任何信息,如何保证从给定位置左/右的N个向量元素确实被加载(不是一个,而是至少16个)?Boost或特定于编译器的预定义宏中是否有包装器api? 本视频将向您解释缓存以及程序执行时发生的情况。它还教您如何最好地编程以使缓存友好 编辑: 基本上,当您加载一个尚未在缓存中的变量时,CPU将加载周围的一块RAM,包括您当时正在使用的内存,这个加载的内存就是缓存线。如果随机使用RAM中不紧密的变量(例如链表),

今年有很多视频/教程/讲座,讨论可以存储在缓存中的向量和对象值数组的重要性。然而,我还没有找到任何信息,如何保证从给定位置左/右的N个向量元素确实被加载(不是一个,而是至少16个)?Boost或特定于编译器的预定义宏中是否有包装器api?

本视频将向您解释缓存以及程序执行时发生的情况。它还教您如何最好地编程以使缓存友好

编辑:

基本上,当您加载一个尚未在缓存中的变量时,CPU将加载周围的一块RAM,包括您当时正在使用的内存,这个加载的内存就是缓存线。如果随机使用RAM中不紧密的变量(例如链表),则每次转到下一个节点时都会加载一条缓存线,这需要时间

在数据结构中,存储器按顺序存储,如向量或数组。接下来要使用的数据很可能已经在缓存线中,您不必离开cpu缓存来获取值

如果您正在迭代一个序列数组,那么您将利用所有的缓存线,并且对预取友好(CPU将尝试猜测下一步将使用什么内存,如果您正在迭代一个序列数组,CPU将预取下一个缓存线,这样您需要的数据在您请求之前就已经存在了。)


缓存线的大小可能会有所不同,但我相信它主要是64字节,这取决于CPU。此外,所有这些都是在CPU上执行的,而您的程序并不知道。编译器无法控制缓存。

不同的处理器具有不同的缓存量和不同的管理方式,并且可能有其他进程与您的进程同时运行并争夺缓存空间,因此您无法保证数据在任何特定时间都在缓存中。您所能做的最好的事情就是以有利于缓存的方式在RAM中安排数据


当数据在数组或向量中连续时,相邻的值通常属于同一缓存线,因此当处理器从RAM中获取一个值时,它会同时将其他一些值加载到缓存中,这是一个副作用。如果您的程序很快使用了这些相邻的值,它们可能(不保证)仍在缓存中。

您自己不会操作缓存。缓存是RAM前面的一个“不可见”层。无论何时从内存中读取,它都会将一定数量的内存复制到缓存中,前提是您可能很快就会访问附近的内存位置。您所看到的讨论建议使用连续内存分配,因为这样一来,阵列/容器的所有元素都可以整齐地放入缓存线中。这意味着您只需要使用诸如
std::vector
std::array
之类的类型。不鼓励使用仅链接的答案。如果这个链接失效,答案就变得毫无价值。从链接中获取要点,并在此处进行总结。这取决于预取的处理器,它将查找如何访问内存的模式,并在需要之前尝试加载内存。当您转到下一个阵列时,您可能会丢失缓存。回答您的问题,没有api或garentee方法,它会在缓存中,但编程很容易,所以它很可能会被缓存,您不必有可预测的访问模式和访问紧挨在一起的内存来利用缓存线。