我做了一些测试来研究堆分配和硬件缓存行为之间的关系。实证结果很有启发性,但也可能具有误导性,尤其是在不同平台和复杂/不确定的用例之间。
我对两种情况感兴趣:批量分配(实现自定义内存池)或后续分配(信任操作系统)。
下面是 C++ 中的两个示例分配测试
//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
这些概念中处于什么位置?