C++ 堆分配如何影响硬件缓存命中率?
我做了一些测试来研究堆分配和硬件缓存行为之间的关系。实证结果很有启发性,但也可能误导,特别是在不同平台和复杂/不确定的用例之间 我感兴趣的场景有两种:批量分配(实现自定义内存池)或后续分配(信任操作系统) 下面是C语言中的两个分配测试示例++C++ 堆分配如何影响硬件缓存命中率?,c++,caching,heap,C++,Caching,Heap,我做了一些测试来研究堆分配和硬件缓存行为之间的关系。实证结果很有启发性,但也可能误导,特别是在不同平台和复杂/不确定的用例之间 我感兴趣的场景有两种:批量分配(实现自定义内存池)或后续分配(信任操作系统) 下面是C语言中的两个分配测试示例++ //Consequent allocations for(auto i = 1000000000; i > 0; i--) int *ptr = new int(0); store_ptr_in_some_container(ptr)
//Consequent allocations
for(auto i = 1000000000; i > 0; i--)
int *ptr = new int(0);
store_ptr_in_some_container(ptr);
//////////////////////////////////////
//Bulk allocation
int *ptr = new int[1000000000];
distribute_indices_to_owners(ptr, 1000000000);
我的问题是:
- 当我为一个只读操作迭代所有这些操作时,如何缓存 CPU中的内存可能会自动分区吗
- 尽管有实证结果(批量生产明显提升了性能 解决方案),当其他一些相对非常小的 大容量分配覆盖以前分配的缓存
- 为了避免代码膨胀并保持代码可读性,将两者混合使用是否合理
- 在这些概念中,
、std::vector
、std::list
、std::map
代表什么std::set
Scratch std::list从引用的集合类列表中,它的缓存效率非常低,因为下一个元素通常位于内存中完全随机的位置。向量是最好的,只是引擎盖下的一个数组。映射通常是用红黑树完成的,这是合理的,但您使用的访问模式当然很重要。std::set也一样。谢谢您的回答。我知道std::list实际上处于一个完全不同的位置。为了完整起见,我把它放在那里了。我会在几天内把它标记得最好,除非出现更长的版本。