几天前,我碰巧看了Stephan T. Lavavej 的这个非常有趣的演讲,其中提到了“我们知道你住在哪里”的优化(抱歉在问题标题中使用了首字母缩写词,所以警告我这个问题可能已经关闭,否则),以及Herb Sutter 关于机器架构的这个漂亮的作品。
简而言之,“我们知道你住在哪里”优化包括将引用计数器放置在与正在创建的对象相同的内存块上make_shared
,从而导致一个内存分配而不是两个内存分配,并且shared_ptr
更加紧凑。
然而,在总结了我从上面两个演示文稿中学到的东西之后,我开始怀疑 WKWYL 优化是否不会降低性能,以防被运行在不同内核上shared_ptr
的多个线程访问。
如果引用计数器接近内存中的实际对象,实际上,它们应该更有可能被提取到与对象本身相同的缓存行中。反过来,如果我得到正确的教训,这将使线程更有可能在竞争相同的缓存行时变慢,即使它们不需要。
假设一个线程需要多次更新引用计数器shared_ptr
(例如,在复制周围时),而其他线程只需要访问指向的对象:这不会通过让所有线程竞争来减慢所有线程的执行速度吗?对于同一个缓存行?
如果 refcount 存在于内存中的其他位置,我会说争用不太可能发生。
这是否是反对在类似情况下使用的一个很好的论据make_shared()
(当然,只要它实现了 WKWYL 优化)?还是我的推理存在谬误?