Можно ли удалить указатель 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++ изменило правила для операторов () и [], чтобы их можно было объявлять статическими. Это позволяет избежать необходимости передавать указатель this при каждом вызове.
Теоретически компилятор мог бы оптимизировать неявный аргумент указателя this, поскольку его местоположение известно во время компиляции (адрес локальной статической переменной). Но я думаю, что компилятор не знает.
Возможно, это скорее обсуждение особенностей языка, чем поиск реального решения.

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

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

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

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

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

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