Разница между реализациями Singleton - PullRequest
2 голосов
/ 06 января 2011

Итак, я нашел разные способы реализовать «создание» синглтона.
РЕДАКТИРОВАТЬ: Когда я говорю «создание», я имею в виду это.Этот код будет помещен в функции Singleton :: {ctor} или статические функции Singleton :: Init ().

//v1
        //the first "1" is casted to a pointer to Ty, then that pointer is casted
        //back to int to obtain the hex address
        //the second 1 is casted to a pointer to Ty, then to a pointer
        //to cSingleton<Ty> because Ty is a derived class and finally
        //back to int to get the hex address
        //after that it's simple pointer arithmetics to get the offset
        int offset = (int)(Ty*)1 - (int)(cSingleton <Ty>*)(Ty*)1;
        m_pSingleton = (Ty*)((int)this + offset);
//v2
        m_pSingleton = static_cast<Ty*>(this);
//v3
        m_pSingleton = (Ty*)this;

Есть ли между ними существенная разница?
Насколько мне известно, v2и v3 должен быть таким же, но это v1, я не очень понимаю.Я вроде знаю, что он делает, но для какой цели?

Кроме того, пожалуйста, не превращайте это в дискуссию "Одиночки - это BAAAAD".

Ответы [ 3 ]

2 голосов
/ 21 мая 2011

(Поскольку вопрос, кажется, умер, я постараюсь ответить на него самостоятельно.)
Что делает v1, так это вручную настраивает указатель this, чтобы он указывал наадрес производного объекта.Обычно static_cast или обычное приведение в стиле c делает это само по себе, но, возможно, этого не произошло в более ранних компиляторах, или была ошибка.Что бы ни случилось, оно делает то, что делают касты.

1 голос
/ 06 января 2011

v2 и v3 почти одинаковы, но v3 использует приведение в стиле c (приведение в стиле c ++ безопаснее, так как вы получаете больше проверок во время компиляции).

v1 - это ... вау... Вот что он делает:

  • приведите число 1 к указателю моего типа Ty и обратно к int.Я ожидал бы, что это все еще приведет к 1.
  • приведению числа 1 к указателю моего типа Ty, приведению к указателю cSingleton<Ty> и, наконец, к int.Я ожидал бы, что это также все еще будет 1.
  • вычитать два.Я ожидал бы, что это будет 0.
  • установите синглтон на this, как в v2 и v3, но с поправкой на "смещение"

Я предполагаю, что есть некоторыеПричудливость архитектуры где-то, где результат приведения 1 приводит к не-1 результату, поэтому смещение будет отличным от нуля.Так что это был бы способ приспособиться для приведения причуд на платформе.

Хотя это предположение, и я надеюсь, что будут некоторые комментарии для объяснения кода (но, вероятно, нет).Может быть, кто-то может ответить более конкретным ответом, чем мой, но, надеюсь, это даст вам возможность продолжить.

0 голосов
/ 06 января 2011

Здесь - хороший пример C ++ синглтона.Я понятия не имею, почему вы используете этот вид кодирования, это вряд ли хорошая практика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...