C++ 指向相邻内存的指针的缓存性能

C++ 指向相邻内存的指针的缓存性能,c++,pointers,memory-management,iteration,C++,Pointers,Memory Management,Iteration,让我们假设我有一个实际数据的std::map,存储在一个连续的内存块中,我想在跳过几个元素的同时对其进行迭代。我有一个函数,将指向地图元素的指针向量组合起来。我的问题是: 迭代此指针列表并遵循它们会导致频繁的缓存未命中吗? 现在,让我们假设整个映射适合几个缓存线 编辑:代码示例。代码片段编辑器在像我这样的触摸设备上不起作用,但我将尝试以可读的方式格式化 int main() { std::map<unsigned int, MyStruct> map; //Fill

让我们假设我有一个实际数据的std::map,存储在一个连续的内存块中,我想在跳过几个元素的同时对其进行迭代。我有一个函数,将指向地图元素的指针向量组合起来。我的问题是: 迭代此指针列表并遵循它们会导致频繁的缓存未命中吗? 现在,让我们假设整个映射适合几个缓存线

编辑:代码示例。代码片段编辑器在像我这样的触摸设备上不起作用,但我将尝试以可读的方式格式化

int main() 
{
    std::map<unsigned int, MyStruct> map;
    //Fill this map with useful data.

    std::vector<MyStruct*> ptrvec; //vector of pointers to pass around. Will not be processed right here, that's just to simplify the example code

    for(MyStruct i : map)
    {
        if(/*some condition to select structs*/) 
        {
            ptrvec.push_back(&i);
        }
    }

    for(MyStruct* i : ptrvec)
    {
        //Do some processing on MyStruct
    }
}
intmain()
{
地图;
//用有用的数据填充这张地图。
std::vector ptrvec;//要传递的指针向量。此处不处理,这只是为了简化示例代码
for(MyStruct i:map)
{
if(/*选择结构的某些条件*/)
{
ptrvec.推回(&i);
}
}
for(MyStruct*i:ptrvec)
{
//对MyStruct进行一些处理
}
}

这个问题非常假设。实际数据的测量和剖面图?存储在连续的内存块中?请解释清楚。关于性能的问题应该总是通过实际的实验来回答。基准测试是一种方法。我目前还没有电脑,但我会尽快测试性能。我问这个问题实际上是想了解更多关于CPU缓存的“耐心”。如果我回到向量上迭代,它会记得映射吗?或者它会抛出所有东西,即使在几个周期内再次访问相同的数据?我假设向量在内存中的不同位置,所有东西都可以被塞进最坏的L3缓存。我相信在这种情况下,缓存能够帮助你,因为无论这些指针存储在哪里,你都会在两个时间段内访问相同的内存位置。不管它是地图还是您使用的任何数据结构。它只是关于访问相同的内存。但再一次,这些只是文字。您需要在实际计算机、实际编译器和实际运行时上下文上进行测试。祝你好运。@Davie Spataro说得对。谢谢添加了一个代码示例以帮助理解问题,但您的评论正是我想要的答案。如果你把它作为答案发布,我可以把它标记为解决方案。非常感谢。