Можно ли удалить указатель this в синглтоне?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Можно ли удалить указатель this в синглтоне?

Сообщение Anonymous »

Этот вопрос касается шаблона Singleton в современном C++ и, в частности, одного из его ограничений.
Я могу реализовать шаблон 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");
// ...
}
Моя проблема заключается в следующем: хотя синглтоны имеют только один экземпляр, каждый вызов функции-члена потребует, чтобы компилятор передавал указатель this вместе с аргументами. Это расточительно. Я мог бы себе представить, что процедурная реализация регистратора, написанная на C, превзошла бы эту одноэлементную реализацию.
По той же причине 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*)
Понимаете, что я имею в виду? Для вызова свободной функции требуются две инструкции (в x86_64), тогда как для одноэлементного вызова — три. Значение, возвращаемое функцией get_instance(), никогда не изменится. Тем не менее, он передается при каждом вызове функции. Именно это я имел в виду под расточительным выше.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -singleton
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»