Я могу реализовать шаблон Singleton следующим образом:
Код: Выделить всё
class Logger
{
public:
static Logger& instance()
{
static Logger singleton {};
return singleton;
}
Logger(const Logger&) = delete;
auto operator= (const Logger&) = delete;
// ... member functions declared here
};
Код: Выделить всё
void start()
{
auto& logger = Logger::instance();
logger.debug("start() called");
// ...
}
По той же причине C++23 допускал объявление операторов () и [] статическими. Это позволяет избежать необходимости передавать указатель this при каждом вызове.
Теоретически компилятор мог бы оптимизировать неявный аргумент указателя this, поскольку его местоположение известно во время компиляции (адрес локальной статической переменной). Но я думаю, что компилятор не знает.
Возможно, это скорее обсуждение особенностей языка, чем поиск фактического решения.
Обновление:
Чтобы прояснить мою ситуацию, я подготовил пример в Compiler Explorer. Сравнение вызова одиночной функции с вызовом свободной функции в сборке:
Синглтон:
Код: Выделить всё
mov esi, OFFSET FLAT:.LC0
mov rdi, rax
call Logger::log_debug(const char*)
Код: Выделить всё
mov edi, OFFSET FLAT:.LC0
call log_debug(const char*)
Подробнее здесь: https://stackoverflow.com/questions/798 ... -singleton
Мобильная версия