To be multi-thread safe, the std::shared_ptr uses atomic operations to perform reference counting. While this is good, I have the following questions:
It will depend on the compiler. Visual Studio 2017 is not smart enough. I cannot tell what clang will do (I am not using them on daily basis) but I will bet that their are not that smart either. As @yachoor pointed out in comment "g++ on Linux is smart enough - it doesn't use atomic operations for std::shared_ptr if program isn't linked with pthread"
Not sure but there is no standard way to do this. Take a look at this. You can use std::move operator so there reference will not be increased. If that is not the case I think that there is no easy way to do this.
Regarding point 2, there are other possibilities. You can extract the pointer to that object and pass it as reference everywhere it is needed in your program. As it is single threaded you should be pretty much sure about lifetime of this object. Otherwise you might want to rethink you memory ownership desing.