Как сохранить вызов get_instance для Singleton в C ++?

nowox спросил: 13 октября 2017 в 07:27 в: c++

В приведенном ниже фиктивном примере я хотел бы создать Singleton, в котором я могу сохранить вызов get_instance, который является дорогостоящим для встроенных микроконтроллеров.

#include <stdio.h>template<class T>
class CamelBase {
    public:
    static T& get_instance() {
        static T instance;
        return instance;
    }        protected:
    CamelBase() {}    
    CamelBase(T const&) = delete;
    void operator=(T const&) = delete;
};class Camel: public CamelBase<Camel> {
    public:
    int answer() {
        return 42;
    }
};int main(void)
{
    printf("%d\n", Camel::get_instance().answer());
    return Camel::get_instance().answer();
}

Мы можем видеть здесь https://godbolt.org/g/1ugPxx, что каждый вызов answer вызывает get_instance, что странно, потому что компилятор в любом случае встроил answer.

main:
  push {r4, lr}
  bl CamelBase<Camel>::get_instance()
  mov r1, #42
  ldr r0, .L15
  bl printf
  bl CamelBase<Camel>::get_instance()
  pop {r4, lr}
  mov r0, #42
  bx lr

Есть ли другой способ написать такой тип Singleton для периферийных устройств, таких как I2C или SPI?

Лучше использовать статический класс? Ссылочный указатель?


0 ответов