共享指针是否在引用计数中使用原子操作,即使在单线程程序中也是如此

Do shared pointers use atomic operations in reference counting even in a single threaded program

为了多线程安全,std::shared_ptr使用原子操作来执行引用计数。虽然这很好,但我有以下问题:

  1. 如果程序是单线程程序,是否有足够智能的编译器可以使用普通(非原子)递增和递减操作来代替?
  2. 按照上面的问题,如果答案是否定的,有没有办法告诉编译器他的程序是单线程的,所以编译时不要费心使用原子操作?
  1. 这取决于编译器。 Visual Studio 2017年不够聪明。我不知道 clang 会做什么(我不是每天都使用它们)但我敢打赌它们也不是那么聪明。正如@yachoor 在评论中指出的 "g++ on Linux is smart enough - it doesn't use atomic operations for std::shared_ptr if program isn't linked with pthread"

  2. 不确定,但没有标准方法可以做到这一点。看看 at this. 你可以使用 std::move 运算符,这样引用就不会增加。如果不是这种情况,我认为没有简单的方法可以做到这一点。

关于第2点,还有其他的可能。您可以提取指向该对象的指针,并将其作为引用传递到程序中需要的任何地方。因为它是单线程的,所以你应该非常确定这个对象的生命周期。否则你可能想重新考虑你的内存所有权设计。