2

据我了解,如果您使用std::make_shared它,它会与基础对象同时创建引用计数对象。

但是,如果 smart_ptr 指向的对象指针大于 56 字节,那么引用计数器是否最终不会位于不同的缓存行中(因为缓存行是 64 字节)?

4

1 回答 1

6

注意:缓存行在每个平台上的大小都不相同,指针的大小也不总是相同的。根据问题中的数字做出假设时要小心。


为什么std::make_shared

std::make_shared存在三个(主要)原因;

  • 意味着同时为ref-counter和被跟踪的对象分配内存(通常内存分配很昂贵);
  • 一种构造和初始化 a 的异常安全的方法std::shared_ptr
  • 和代码简洁。

缓存行和std::make_shared呢?

老实说,这超出了std::make_shared. C++ 标准不知道“缓存线”是什么,并且标准中描述的设计是这样编写的,它不针对任何特定平台。

即使会有 *cache-misse*s 因为ref-counter和对象不能放在同一个cache-line中,我们仍然拥有前面列出的所有好处,并且std::make_shared仍然可以完成它打算解决的工作。

注意:可以说“在内存中保持引用计数器和对象靠近在一起”只是一个甜蜜的小奖励。

于 2014-05-21T04:45:25.463 回答