即使在单线程程序中,共享指针也会在引用计数中使用原子操作吗?

时间:2019-03-22 10:45:35

标签: c++ multithreading shared-ptr

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

  1. 如果程序是单线程程序,那么编译器是否足够聪明,可以使用普通(非原子)增量和减量运算呢?
  2. 在上面的问题之后,如果答案是否定的,是否有办法告诉编译器他的程序是单线程的,因此在编译它时不要费心使用原子操作?

1 个答案:

答案 0 :(得分:0)

  1. 这取决于编译器。 Visual Studio 2017不够智能。我不能说出叮当声会做什么(我不是每天都在使用它们),但是我敢打赌它们也不是那么聪明。正如@yachoor在评论中指出的那样:“ Linux上的g ++足够聪明-如果程序未与pthread链接,则它不会对std :: shared_ptr使用原子操作”

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

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