Здравствуйте, Аноним, Вы писали:
А>Спасибо. А если GetInstance будет internal, то её адрес и сам код тоже, как и её статические данные, будут свои для каждой единицы трансляции?
Да.
А>То есть полный копи/паст? Или это уже от компилятора зависит?
Полный копи/паст.
Любите книгу — источник знаний (с) М.Горький
Re[7]: Креш в синглтоне Мейерса
От:
Аноним
Дата:
27.11.07 13:19
Оценка:
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
А>>Спасибо. А если GetInstance будет internal, то её адрес и сам код тоже, как и её статические данные, будут свои для каждой единицы трансляции? B>Да.
А>>То есть полный копи/паст? Или это уже от компилятора зависит? B>Полный копи/паст.
Спасибо за ликбез
Если Вам не надоели мои вопросы, то вот ещё
Для чего, в принципе, нужен internal linkage?
Для чего может понадобиться в каждом модуле дублировать код функций и константы?
Может это вынужденная мера языка, например, для поддержки шаблонов?
Здравствуйте, Аноним, Вы писали:
А>Для чего может понадобиться в каждом модуле дублировать код функций и константы? А>Может это вынужденная мера языка, например, для поддержки шаблонов?
1) internal l. в С++ лучше достигается не при помощи статических констант и функций, а при помощи анонимных пространств имён.
2) Ну вот представь себе, что написал ты что-то типа:
но с external l. и в другом каком-то cpp напишешь другую табличку. Будет геморр и путанница какая табличка к кому относится.
А при internal l. всё изолировано и хорошо выходит...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Аноним, Вы писали:
А>Для чего, в принципе, нужен internal linkage?
Для изоляции некоей сущности в единице трансляции. А>Для чего может понадобиться в каждом модуле дублировать код функций и константы?
Главная фишка в том, что под одним и тем же именем в разных единицах трансляции могут скрываться разные сущности . Например разные функции с одинаковым именем.
А вот копия константы — это совсем даже не плохо — можно вставить ее прямо в исполняемый код и забыть о ссылках не нее.
А>Может это вынужденная мера языка, например, для поддержки шаблонов?
Скорее наоборот. В качетсве параметров шаблонов могут использоваться только сущности с external linkage. А статические функции и константы в текущем стандарте помечены как устаревшие:
7.3.1.1/2
The use of the static keyword is deprecated when declaring objects in a namespace scope (see annex D);
the unnamed-namespace provides a superior alternative.
Т.е. для этой цели рекомедуется использовать безымянные пространства имен:
namespace
{
void func() {};
}
В этом случае и имя изолировано, а значит не мешает другим идиницам трансляции, и функция func имеет внешнее связывание.
Любите книгу — источник знаний (с) М.Горький
Re[9]: Креш в синглтоне Мейерса
От:
Аноним
Дата:
27.11.07 14:38
Оценка:
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Аноним, Вы писали:
А>>Для чего может понадобиться в каждом модуле дублировать код функций и константы? А>>Может это вынужденная мера языка, например, для поддержки шаблонов?
E>1) internal l. в С++ лучше достигается не при помощи статических констант и функций, а при помощи анонимных пространств имён. E>2) Ну вот представь себе, что написал ты что-то типа:
E>но с external l. и в другом каком-то cpp напишешь другую табличку. Будет геморр и путанница какая табличка к кому относится.
E>А при internal l. всё изолировано и хорошо выходит...
Ага, полезная штука, спасибо.
Re[9]: Креш в синглтоне Мейерса
От:
Аноним
Дата:
27.11.07 14:59
Оценка:
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
А>>Для чего, в принципе, нужен internal linkage? B>Для изоляции некоей сущности в единице трансляции. А>>Для чего может понадобиться в каждом модуле дублировать код функций и константы? B>Главная фишка в том, что под одним и тем же именем в разных единицах трансляции могут скрываться разные сущности . Например разные функции с одинаковым именем. B>А вот копия константы — это совсем даже не плохо — можно вставить ее прямо в исполняемый код и забыть о ссылках не нее.
А>>Может это вынужденная мера языка, например, для поддержки шаблонов? B>Скорее наоборот. В качетсве параметров шаблонов могут использоваться только сущности с external linkage. А статические функции и константы в текущем стандарте помечены как устаревшие: B>
B>7.3.1.1/2
B>The use of the static keyword is deprecated when declaring objects in a namespace scope (see annex D);
B>the unnamed-namespace provides a superior alternative.
B>Т.е. для этой цели рекомедуется использовать безымянные пространства имен: B>
B>namespace
B>{
B> void func() {};
B>}
B>
B>В этом случае и имя изолировано, а значит не мешает другим идиницам трансляции, и функция func имеет внешнее связывание.